列表初始化的形式

时间:2016-07-26 06:56:04

标签: c++ c++11 initialization initializer-list list-initialization

请参阅以下代码:

std::vector<int> v1{1, 2, 3};
std::vector<int> v2 = {1, 2, 3};

我的问题是:

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

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

2 个答案:

答案 0 :(得分:8)

在这种情况下,两个(direct-list-initialization vs copy-list-initialization)完全相同。没有构建临时BoundedOutOfOrdernessGenerator且没有std::vector被调用。等号是初始化语法的一部分。

如果std::vector's constructor overload no. 7被标记为std::vector::operator=会有所不同,在这种情况下,任何复制初始化都会失败,但这将是标准设计中的一个缺陷库。

答案 1 :(得分:8)

他们都是list initialization(自C ++ 11以来)。第一个是直接列表初始化,第二个是复制列表初始化。

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

对于直接列表初始化,将考虑显式和非显式构造函数,而copy-list-initialization只能调用非显式构造函数。对于这种情况(即std::vector),实际结果是相同的。

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

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