为什么使用 C++17 禁用 std::atomic 的复制省略不起作用?

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

为什么是这样?

use*_*522 6

C++17 并不是简单地说以前可选的返回值优化现在是强制性的。语言的实际描述发生了变化,因此首先不再创建临时对象。

因此,从 C++17 开始,不再有可以省略的构造函数调用。-fno-elide-constructors因此,不添加任何临时创建是有道理的。这违反了语言规则。

在 C++17 之前,语言描述了创建一个临时对象并从中初始化变量,然后添加允许编译器删除此临时对象。因此,无论是否-fno-elide-constructors使用,编译器都会通过删除或不删除临时副本来表现出符合标准的行为。

  • @RichardCritten 在 C++17 之前,复制初始化总是创建一个副本。请给我一点时间作为标准参考。 (2认同)