为什么 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 时,它可以工作:魔杖盒
我检查了 cpp 首选项的差异:
std::atomic
std::atomic<T>::operator=
std::atomic<T>::atomic
但是C++14和C++17之间没有区别。为什么它适用于 C++17 而不是 C++14?
因为在 C++17 中有一个保证的 RVO。在 C++14 中,像Foo x = Foo(args)
和Foo x (args)
这样的语句在技术上并不相同,但它们在第 17 C++。
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)
节:
(f((((;//只调用一次 T 的默认构造函数, to 初始化 X
要使 C++14 代码正常工作,您可以使用
std::atomic_int idx { 1 };
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何在c++17中制作一个模板包装器/装饰器
- 如何从 std::atomic 中提取指针 T<T>?
- 枚举环境变量的惯用C++14/C++17方法
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- C++17中的并行执行策略
- std::memory_order for std::atomic:<T>:wait
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 并行用于C++17中数组索引范围内的循环
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 在C++17中,引用const字符串的语义应该是什么
- 为什么这种直接初始化有效?(C++17)
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 为什么 C++17 中没有 std::construct_at?
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同