列表初始化的形式
Forms of list initialization
见以下代码:
std::vector<int> v1{1, 2, 3};
std::vector<int> v2 = {1, 2, 3};
我的问题是:
两者有区别吗?我知道第一个肯定是列表初始化,但是第二个呢?
因为第二个有一个赋值符号,这让我觉得编译器会先使用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
- Is there any difference between the two?
对于直接列表初始化,显式和非显式构造函数都将被考虑,而复制列表初始化只可能调用非显式构造函数。对于这种情况(即 std::vector
),实际结果是相同的。
- 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
.
见以下代码:
std::vector<int> v1{1, 2, 3};
std::vector<int> v2 = {1, 2, 3};
我的问题是:
两者有区别吗?我知道第一个肯定是列表初始化,但是第二个呢?
因为第二个有一个赋值符号,这让我觉得编译器会先使用
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
- Is there any difference between the two?
对于直接列表初始化,显式和非显式构造函数都将被考虑,而复制列表初始化只可能调用非显式构造函数。对于这种情况(即 std::vector
),实际结果是相同的。
- 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
.