gpt4 book ai didi

c++ - clang-tidy(版本 14)是否正确,此代码上有 `bugprone-use-after-move` 错误?

转载 作者:行者123 更新时间:2023-12-05 01:49:45 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com