Mic*_*hal 10 c++ initialization copy-elision stdatomic c++17
我有一个简单的代码:
#include <atomic>
int main()
{
std::atomic<int> a = 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码可以在 GCC 11.1.0 和 -std=c++17 下正常编译,但在 -std=c++14 和 -std=c++11 时失败。
使用删除的函数 std::atomic::atomic(const std::atomic&)
这是为什么?在 C++17 类中std::atomic
仍然没有复制构造函数。为什么此代码对 -std=c++17 有效?
当然,我知道首选样式是 use {}
,但我很好奇为什么上面的代码从 C++17 开始就可以很好地编译。
son*_*yao 13
由于 C++17保证了这种复制省略。对于std::atomic<int> a = 0;
,a
需要0
直接初始化。
注意:上面的规则没有指定优化:纯右值和临时值的 C++17 核心语言规范与早期的 C++ 修订版根本不同:不再有临时值可以复制/移动。描述 C++17 机制的另一种方法是“非物化值传递”:返回和使用纯右值,而不会物化临时值。
在 C++17 之前,即使复制/移动操作(a
从初始化的临时std::atomic<int>
初始化0
)可能被优化掉(在复制初始化中),复制/移动构造函数仍然需要可访问。
最后一步通常被优化掉,转换的结果直接在为目标对象分配的内存中构造,但是即使没有使用适当的构造函数(移动或复制)也需要可以访问。(直到 C++17)
归档时间: |
|
查看次数: |
251 次 |
最近记录: |