为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同

Tho*_*lik 18 c++ stdatomic c++14 c++17

我在一个 C++11 项目中工作,我尝试了以下代码

#include <atomic>

struct A {
    std::atomic_int idx = 1;

};

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误

error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
 std::atomic_int idx = 1;
                       ^
Run Code Online (Sandbox Code Playgroud)

C++14 也有同样的结果。当我切换到 C++17 时它可以工作:wandbox

我检查了 cppreference 的差异:

但是 C++14 和 C++17 之间没有区别。为什么它适用于 C++17 而不适用于 C++14?

Rin*_*dov 29

因为在 C++17 中有一个有保证的 RVO。在 C++14 中,likeFoo x = Foo(args)Foo x (args)在技​​术上是不一样的,但它们在 C++17 中。

struct Foo {
    Foo() = default;
    Foo(const Foo&) = delete;
};

int main() {
    // Works in C++17 and C++20, fails in C++14 and before
    Foo foo = Foo(); 
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读更多相关信息:https : //en.cppreference.com/w/cpp/language/copy_elision

特别是该部分(since C++17)

T x = T(T(f())); // 只调用一次 T 的默认构造函数来初始化 x

要使 C++14 代码工作,您可以使用

std::atomic_int idx { 1 };
Run Code Online (Sandbox Code Playgroud)