Std::initializer_list和=操作符
std::initializer_list and the = operator
我这样做:
MyClass a=b;
使用复制构造函数初始化a
,而不涉及=
操作符重载,对吗?
如果a
已经初始化,那么=
操作符将被使用,然后我稍后将其赋值给其他东西。
I saw 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::vector
构造函数与std::initializer_list
的工作原理。当操作符不调用复制构造时,使用=
操作符初始化对象似乎令人困惑,不是吗?
使用复制构造函数初始化a,不涉及=操作符重载,对吗?
。
为什么不采用这样的语法:[…]
您可以使用这两种形式,它们基本上是等效的,除了使用=
的形式称为copy-list-initialization,并且它需要一个非explicit
构造函数(感谢Nicol Bolas的更正)。
=
的形式称为direct-list-initialization,它通过从初始化器直接构造对象(将初始化器作为参数传递给要初始化的对象的构造器)来(非常直观地)工作。构造函数是否为explicit
与此无关。
所以简而言之,这两种形式是等价的,除了如果构造函数是explicit
, copy-list-initialization将不起作用。如果不是这样的话,选择哪种形式主要是风格问题。
MyClass a=b;
只有在b
是MyClass
类型时才使用复制构造函数。
如果b
是OtherClass
,您将需要另一个构造函数,它不是复制构造函数,只是另一个自定义构造函数,将OtherClass
作为参数(或者更可能是const OtherClass&
,但这与问题无关-只是防止挑剔者:)。
与initializer_list
的示例相同:它是S
类型的普通构造函数,它将初始化列表作为参数。在这个意义上,它与假设的构造函数S(int n)
没有什么不同。
如果你有:
S(int n) : v(n) {} // ctor taking an int
你可以创建一个这样的实例:
S s = 4;
相关文章:
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- C2664 无法从'initializer list'转换参数
- C++ 错误:"array must be initialized with a brace-enclosed initializer"
- 2D 数组中的"Excess elements in scalar initializer"错误
- 为什么map有操作符[],set没有
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- 在C++中标记化"Braced Initializer List"样式字符串(使用 Boost?
- std::move in initializer lists
- "Default member initializer needed within definition of enclosing class outside of member functions
- 外部抛出"both extern and initializer"错误
- 从成员构造函数(Brace Initializer vs Initializer列表)抛出异常
- "默认参数":无法从'initializer list'转换为'std::initializer_list'
- 无法从'initializer-list'转换为用户控制器
- 无法运行简单的 std::async 和 std::future 测试程序。错误:"has initializer but incomplete type."发生了什么?
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- 我是否应该担心C 17中的Wmissing-Field-Initializer和汇总初始化
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- 为什么在基于initializer示例的基于范围内的语句中,f()
- 递归调用中出现错误"[Error] expression list treated as compound expression in initializer [-fpermissive]"
- 导致IAR ARM中出现错误的成员结构位字段元素的Initializer列表初始化