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

标签 c++ c++20 move clang-tidy

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/

相关文章:

c++ - 确定 vector<char> 中出现频率最高的 char 元素?

c++ - C++ 概念的通配符为 "accepting anything for this template argument"

c++ - 非原子类型如何实现std::atomic_ref?

c++ - 如果有 if-constexpr,为什么没有 switch-constexpr?

Javascript 将多个元素 move 到单独的 div 并返回

c++ - 以下代码是否调用未定义的行为?

c++ - std::move 一个 vector 到另一个 vector ,地址不更新

c++ - 如何像 future 一样为 C++ STL 模板文件生成标签文件?

C++:对象和外部函数的生命周期

c++ - 代码适用于示例运行但提交失败 : Hackerrank problem