struct test {
test& foo(std::vector<int> const& v) {
assert(v.size() == 1); return *this;
}
void bar(std::vector<int> v) {}
};
void do_test() {
std::vector<int> v = { 42 };
return test{}.foo(v).bar(std::move(v)); // <-- here
}
clang-tidy 在“here”字符串上给出错误 bugprone-use-after-move
为什么是 move 后使用?
最佳答案
自 C++17 起,保证函数调用中的 postfix-expression,即这里的 test{}.foo(v).bar
被评估之前参数列表中的任何表达式。
因此 move 构造只会在 foo
返回后发生。
但是,在 C++17 之前没有这样的保证, move 构造可能发生在调用 foo
之前。
依赖这些新的保证是否是个好主意值得怀疑。一些工具倾向于忽略它们并继续警告此类代码,因为如果使用不同的 -std=
标志编译会很危险。例如,GCC 对其 -Wunsequenced
警告执行相同的操作。还有一个风险是,当 C++17 刚刚实现时,一些较旧的编译器版本可能仍然存在这方面的错误。
关于c++ - clang-tidy(版本 14)是否正确,此代码上有 `bugprone-use-after-move` 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73729536/