gpt4 book ai didi

c++ - 复制列表初始化是否在概念上调用复制构造函数?

转载 作者:可可西里 更新时间:2023-11-01 16:37:33 26 4
gpt4 key购买 nike

在 C++11 之前,我们可以通过编写类似于 A a = 1; 的代码来进行复制初始化,这或多或少等同于 A a = A(1);。也就是说,首先创建一个临时对象,然后调用一个复制构造函数。无论复制省略如何,这在概念上必须如此,并且复制构造函数必须可访问。

在 C++11 中使用列表初始化,我们可以通过编写 A a = {1, 2}; 来进行复制列表初始化。在我看来,这应该或多或少等同于 A a = A(1, 2);。但是,在 GCC 和 clang 上,A a = {1, 2} 即使复制和移动 ctor 不可访问(通过声明为私有(private))也会编译。尽管如此,如果相应的复制/移动构造函数不可访问,A a = 1; 不会在 GCC 或 clang 上编译。因此,A a = {1, 2}; 似乎或多或少等同于 A a{1, 2};,后者是直接列表初始化。这与真正的直接列表初始化之间的区别在于,如果采用两个 int 的构造函数是显式的,则 A a = {1, 2}; 不会编译。在这方面,A a = {1, 2}; 类似于复制初始化。

所以,我的问题是:从概念上讲,像 A a = {1, 2}; 这样的表达式的确切语义是什么? 概念上,复制省略不会成为障碍。

最佳答案

标准很好地描述了它; [dcl.init.list]/3:

List-initialization of an object or reference of type T is defined as follows:

  • [...]
  • Otherwise, if T is a class type, constructors are considered. The applicable constructors are enumerated and the best one is chosen through overload resolution (13.3, 13.3.1.7). If a narrowing conversion (see below) is required to convert any of the arguments, the program is ill-formed.

[over.match.list](强调我的):

When objects of non-aggregate class type T are list-initialized (8.5.4), overload resolution selects the constructor in two phases:

  • Initially, the candidate functions are the initializer-list constructors (8.5.4) of the class T and the argument list consists of the initializer list as a single argument.

  • If no viable initializer-list constructor is found, overload resolution is performed again, where the candidate functions are all the constructors of the class T and the argument list consists of the elements of the initializer list.

If the initializer list has no elements and T has a default constructor, the first phase is omitted.
In copy-list-initialization, if an explicit constructor is chosen, the initialization is ill-formed.

因此,如果未找到初始化列表构造函数(如您的情况),则初始化列表的元素构成构造函数调用的参数。
事实上,direct-list-initialization 和 copy-list-initialization 的唯一区别包含在最后一个加粗的句子中。

这是列表初始化的优点之一:它不需要存在无论如何都不会被使用的特殊成员函数。

关于c++ - 复制列表初始化是否在概念上调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26964221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com