放宽 C++17 中的复制初始化要求
Relaxation of copy initialization requirements in C++17
我对 cppref 语句感到困惑:
[...] The result of the conversion, which is a prvalue expression (since
C++17) if a converting constructor was used, is then used to
direct-initialize the object.
The last step is usually optimized out and the result of the
conversion is constructed directly in the memory allocated for the
target object, but the appropriate constructor (move or copy) is
required to be accessible even though it's not used. (until C++17)
我在 gcc 8.0.1 上测试了代码 std::atomic_int atom = 1;
,它用 C++17 编译,但 fails 用 C++14 编译,出现以下错误:
error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'
std::atomic_int atom = 1;
^
这是否意味着适当的构造函数(移动或复制)(总是?)不再需要在 C++17 中访问?
在 C++17 中 copy elision 是 强制性 的情况下,永远不会使用这些构造函数。那样的话就没有什么可检查的了。
在早期版本中,省略只是可选的,需要访问检查才能在编译器之间获得一致的结果。对于省略不是强制性的情况,在 C++17 中仍然会发生。
我对 cppref 语句感到困惑:
[...] The result of the conversion, which is a prvalue expression (since C++17) if a converting constructor was used, is then used to direct-initialize the object. The last step is usually optimized out and the result of the conversion is constructed directly in the memory allocated for the target object, but the appropriate constructor (move or copy) is required to be accessible even though it's not used. (until C++17)
我在 gcc 8.0.1 上测试了代码 std::atomic_int atom = 1;
,它用 C++17 编译,但 fails 用 C++14 编译,出现以下错误:
error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'
std::atomic_int atom = 1;
^
这是否意味着适当的构造函数(移动或复制)(总是?)不再需要在 C++17 中访问?
在 C++17 中 copy elision 是 强制性 的情况下,永远不会使用这些构造函数。那样的话就没有什么可检查的了。
在早期版本中,省略只是可选的,需要访问检查才能在编译器之间获得一致的结果。对于省略不是强制性的情况,在 C++17 中仍然会发生。