首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::initializer_list和=运算符

std::initializer_list和=运算符
EN

Stack Overflow用户
提问于 2013-06-05 16:44:11
回答 2查看 693关注 0票数 3

如果我这样做:

代码语言:javascript
复制
 MyClass a=b;

这使用复制构造函数来初始化a,并且不涉及=操作符重载,对吗?

如果a已经初始化,然后我将其赋给其他值,则将使用=运算符。

我看到this

代码语言:javascript
复制
S(std::initializer_list<T> l) : v(l) {

用法如下:

代码语言:javascript
复制
S<int> s = {1, 2, 3, 4, 5}; // direct list-initialization

这很有趣。它是初始化,它使用=运算符,但它调用的构造函数不是复制构造函数。为什么它不采用这样的语法:

代码语言:javascript
复制
S<int> s {1, 2, 3, 4, 5};

这就是带有std::initializer_liststd::vector constructor的工作方式。当=操作符没有调用复制构造时,使用该操作符初始化对象似乎很混乱,不是吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-05 16:49:39

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

一点儿没错。

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

您可以使用这两种表单,它们基本上是等价的,除了使用=的表单被称为复制列表初始化,并且它需要一个非explicit构造函数(感谢Nicol Bolas的更正)。

另一方面,没有=的形式被称为直接列表初始化,它(相当直观地)通过从初始化器直接构造对象来工作(将初始化器作为参数传递给要初始化的对象的构造函数)。构造函数是否为explicit在这里并不重要。

因此,简而言之,这两种形式是等价的,只是如果构造函数为explicit,则复制列表初始化将不起作用。如果不是这样,选择哪种形式主要是一个风格问题。

票数 12
EN

Stack Overflow用户

发布于 2013-06-05 16:49:04

仅当b的类型为MyClass时,MyClass a=b;才使用复制构造函数。

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

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

想象一下,如果你有:

代码语言:javascript
复制
S(int n) : v(n) {}  // ctor taking an int

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

代码语言:javascript
复制
S s = 4;

初始化器列表也是如此。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16935295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档