Ari*_*Ari 2 c++ copy-elision c++17
由于std::atomic复制构造函数被删除,并且由于复制省略,这应该只能使用 C++17 及更高版本进行编译:
std::atomic<int> t_int = 1;
Run Code Online (Sandbox Code Playgroud)
我预计它不会使用-fno-elide-constructors标志进行编译,但它仍然可以编译:
https://godbolt.org/z/nMvG5vTrK
为什么是这样?
C++17 并不是简单地说以前可选的返回值优化现在是强制性的。语言的实际描述发生了变化,因此首先不再创建临时对象。
因此,从 C++17 开始,不再有可以省略的构造函数调用。-fno-elide-constructors因此,不添加任何临时创建是有道理的。这违反了语言规则。
在 C++17 之前,语言描述了创建一个临时对象并从中初始化变量,然后添加允许编译器删除此临时对象。因此,无论是否-fno-elide-constructors使用,编译器都会通过删除或不删除临时副本来表现出符合标准的行为。
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |