列表初始化的形式

zha*_*min 2 c++ initialization initializer-list c++11 list-initialization

请参阅以下代码:

std::vector<int> v1{1, 2, 3};
std::vector<int> v2 = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这两者有区别吗?我知道第一个必须是列表初始化,但第二个怎么样?

  2. 因为第二个有一个赋值符号,所以我认为编译器会首先使用它std::initializer_list来创建一个临时符号vector,然后使用复制构造函数将temp复制vectorv2.这是事实吗?

Log*_*uff 8

在这种情况下,两者(直接列表初始化复制列表初始化)完全相同.没有临时std::vector建造,也没有std::vector::operator=被召唤.等号是初始化语法的一部分.

如果std::vector构造函数重载没有,那将会有所不同.标记为7explicit,在这种情况下,任何复制初始化都会失败,但这将是标准库设计中的一个缺陷.


son*_*yao 8

它们都是列表初始化(从C++ 11开始).第一个是直接列表初始化,第二个是复制列表初始化.

  1. 这两者有什么区别吗?

对于直接列表初始化,将考虑显式和非显式构造函数,而可能仅调用复制列表初始化非显式构造函数.对于这种情况(即std::vector),实际结果是相同的.

  1. 因为第二个有一个赋值符号,所以我认为编译器会首先使用initializer_list创建一个临时向量,然后使用复制构造函数将临时向量复制到v2.这是事实吗?

不.即使对于复制列表初始化,对象也将由适当的构造函数直接构造.对于这种情况,std::initializer_list<int>将创建一个临时的,然后std::vector::vector(std::initializer_list<T>, const Allocator& = Allocator())将调用它来构造v2.

  • @AndreiR.不,在某些情况下它们并不相同.我在答案中解释过,你可能会指出我错在哪里. (2认同)