列表初始化的形式

Forms of list initialization

见以下代码:

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

我的问题是:

  1. 两者有区别吗?我知道第一个肯定是列表初始化,但是第二个呢?

  2. 因为第二个有一个赋值符号,这让我觉得编译器会先使用std::initializer_list创建一个临时的vector,然后再使用复制构造函数将临时 vector 复制到 v2。这是事实吗?

这两个(direct-list-initialization vs copy-list-initialization)在本例中是完全一样的。没有构造临时 std::vector 并且没有调用 std::vector::operator= 。等号是初始化语法的一部分。

如果 std::vector's constructor overload no. 7 被标记为 explicit 会有不同,在这种情况下任何 copy-initialization 都会失败,但这将是标准库的设计。

它们都是 list initialization (C++11 起)。第一个是direct-list-initialization,第二个是copy-list-initialization

  1. Is there any difference between the two?

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

  1. Because there is a assign sign for the second, it makes me think that the compiler will use the initializer_list to create an temp vector first, then it use copy constructor to copy the temp vector to v2. Is this the fact?

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