A a = 1;
在 C++11 之前,我们可以通过编写类似于A a = A(1);
. 也就是说,首先创建一个临时对象,然后调用一个复制 ctor。无论复制省略如何,这在概念上都必须如此,并且复制 ctor 必须是可访问的。
使用 C++11 中的列表初始化,我们可以通过编写A a = {1, 2};
. 在我看来,这应该或多或少等同于A a = A(1, 2);
. 但是,在 GCC 和 clang 上,A a = {1, 2}
即使复制和移动 ctor 不可访问(通过声明为私有)也可以编译。尽管如此,A a = 1;
如果相应的复制/移动 ctor 不可访问,则不会在 GCC 或 clang 上编译。因此,A a = {1, 2};
似乎或多或少等同于A a{1, 2};
直接列表初始化。这与真正的直接列表初始化之间的区别在于,A a = {1, 2};
如果采用两个 int 的 ctor 是显式的,则不会编译。在这方面,A a = {1, 2};
类似于复制初始化。
所以,我的问题是:A a = {1, 2};
概念上的表达式的确切语义是什么?从概念上讲,复制省略不会妨碍您。