3

如果我这样做:

 MyClass a=b;

这里使用复制构造函数来初始化a=不涉及运算符重载,对吧?

=如果已经初始化,则将使用该运算符a,然后我将其分配给其他东西。

我看到了这个

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};

这就是带有 an的std::vector 构造函数std::initializer_list的工作原理。当运算符不调用复制构造时,使用运算符初始化对象似乎令人困惑=,不是吗?

4

2 回答 2

12

这里使用复制构造函数来初始化a,不涉及=运算符重载,对吧?

确切地。

为什么它不采用这样的语法:[...]

您可以使用这两种形式,它们大多是等效的,除了使用的形式=称为copy-list-initialization,并且它需要一个非explicit构造函数(感谢 Nicol Bolas 的更正)。

=另一方面,没有.)。构造函数是否explicit在这里无关紧要。

所以简而言之,这两种形式是等价的,除了如果你的构造函数是explicit. 如果不是这样,选择哪种形式主要是风格问题。

于 2013-06-05T08:49:38.893 回答
4

MyClass a=b;b仅当is 类型时才使用复制构造函数MyClass

如果bOtherClass,您将需要另一个构造函数,它不是复制构造函数,只是另一个OtherClass作为参数的自定义构造函数(或更可能const OtherClass&,但这与问题无关 - 只是防止挑剔者:)。

您的示例也是如此initializer_list:它是 type 的普通构造函数S,它将初始化列表作为参数。从这个意义上说,它与一些假设的构造函数没有什么不同S(int n)

想象一下,如果你有:

S(int n) : v(n) {}  // ctor taking an int

您可以像这样创建一个实例:

S s = 4;

初始化列表也是如此。

于 2013-06-05T08:49:04.100 回答