【发布时间】:2015-01-13 20:45:35
【问题描述】:
在 C++11 之前,我们可以通过编写类似 A a = 1; 的内容来进行复制初始化,这或多或少等同于 A a = A(1);。也就是说,首先创建一个临时对象,然后调用一个复制 ctor。不管复制省略如何,这在概念上必须如此,并且复制 ctor 必须是可访问的。
使用 C++11 中的列表初始化,我们可以通过编写 A a = {1, 2}; 来进行复制列表初始化。在我看来,这应该或多或少等同于A a = A(1, 2);。然而,在 GCC 和 clang 上,A a = {1, 2} 编译即使复制和移动 ctor 不可访问(通过声明为私有)。尽管如此,如果相应的复制/移动 ctor 不可访问,A a = 1; 不会在 GCC 或 clang 上编译。所以,A a = {1, 2}; 似乎或多或少等同于直接列表初始化的A a{1, 2};。这与真正的直接列表初始化之间的区别在于,如果采用两个 int 的 ctor 是显式的,则 A a = {1, 2}; 不会编译。在这方面,A a = {1, 2}; 类似于复制初始化。
所以,我的问题是:在概念上,像 A a = {1, 2}; 这样的表达式的确切语义是什么? 在概念上,复制省略不会成为阻碍。
【问题讨论】:
-
您已经在问题中自己解释了所有内容。复制列表初始化与直接列表初始化相同,只是前者不考虑显式构造函数。两者都不需要可访问的复制构造函数。
-
@Praetorian 这似乎不完全一样。请参阅我对哥伦布回答的评论。
标签: c++ c++11 copy-constructor list-initialization copy-initialization