如果我这样做:
MyClass a=b;这使用复制构造函数来初始化a,并且不涉及=操作符重载,对吗?
如果a已经初始化,然后我将其赋给其他值,则将使用=运算符。
我看到this了
S(std::initializer_list<T> l) : v(l) {用法如下:
S<int> s = {1, 2, 3, 4, 5}; // direct list-initialization这很有趣。它是初始化,它使用=运算符,但它调用的构造函数不是复制构造函数。为什么它不采用这样的语法:
S<int> s {1, 2, 3, 4, 5};这就是带有std::initializer_list的std::vector constructor的工作方式。当=操作符没有调用复制构造时,使用该操作符初始化对象似乎很混乱,不是吗?
发布于 2013-06-05 16:49:39
这使用复制构造函数来初始化,并且不涉及=运算符重载,对吗?
一点儿没错。
为什么它不采用这样的语法:...
您可以使用这两种表单,它们基本上是等价的,除了使用=的表单被称为复制列表初始化,并且它需要一个非explicit构造函数(感谢Nicol Bolas的更正)。
另一方面,没有=的形式被称为直接列表初始化,它(相当直观地)通过从初始化器直接构造对象来工作(将初始化器作为参数传递给要初始化的对象的构造函数)。构造函数是否为explicit在这里并不重要。
因此,简而言之,这两种形式是等价的,只是如果构造函数为explicit,则复制列表初始化将不起作用。如果不是这样,选择哪种形式主要是一个风格问题。
发布于 2013-06-05 16:49:04
仅当b的类型为MyClass时,MyClass a=b;才使用复制构造函数。
如果b是OtherClass,你将需要另一个构造函数,它不是复制构造函数,只是另一个接受OtherClass作为参数的自定义构造函数(或者更有可能是const OtherClass&,但这与问题无关-只是防止挑剔:)。
使用initializer_list的示例也是如此:它是S类型的普通构造函数,该构造函数接受初始化器列表作为参数。从这个意义上说,它与一些假设的构造函数S(int n)没有什么不同。
想象一下,如果你有:
S(int n) : v(n) {} // ctor taking an int您可以像这样创建一个实例:
S s = 4;初始化器列表也是如此。
https://stackoverflow.com/questions/16935295
复制相似问题