为什么 std::atomic 构造函数在 C++14 和 C++17 中表现不同
Why does std::atomic constructor behave different in C++14 and C++17
我在一个使用 C++11 的项目中工作,我尝试了以下代码
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
我收到编译器错误
error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^
C++14 的结果相同。当我切换到 C++17 时,它起作用了:wandbox
我检查了 cppreference 的差异:
但是 C++14 和 C++17 之间没有任何区别。为什么它适用于 C++17 而不适用于 C++14?
因为在 C++17 中有保证的 RVO。在 C++14 中,像 Foo 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();
}
您可以在此处阅读更多相关信息:https://en.cppreference.com/w/cpp/language/copy_elision
特别是 (since C++17)
部分:
T x = T(T(f())); // only one call to default constructor of T, to
initialize x
要使 C++14 代码工作,您可以使用
std::atomic_int idx { 1 };
我在一个使用 C++11 的项目中工作,我尝试了以下代码
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
我收到编译器错误
error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^
C++14 的结果相同。当我切换到 C++17 时,它起作用了:wandbox
我检查了 cppreference 的差异:
但是 C++14 和 C++17 之间没有任何区别。为什么它适用于 C++17 而不适用于 C++14?
因为在 C++17 中有保证的 RVO。在 C++14 中,像 Foo 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();
}
您可以在此处阅读更多相关信息:https://en.cppreference.com/w/cpp/language/copy_elision
特别是 (since C++17)
部分:
T x = T(T(f())); // only one call to default constructor of T, to initialize x
要使 C++14 代码工作,您可以使用
std::atomic_int idx { 1 };