请参阅以下代码:
std::vector<int> v1{1, 2, 3};
std::vector<int> v2 = {1, 2, 3};
我的问题是:
这两者有区别吗?我知道第一个必须是列表初始化,但第二个怎么样?
因为第二个有一个赋值符号,所以我认为编译器会首先使用std::initializer_list
创建一个临时vector
,然后使用复制构造函数来复制临时vector
到v2
。这是事实吗?
答案 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以来)。第一个是直接列表初始化,第二个是复制列表初始化。
- 这两者有什么区别吗?
醇>
对于直接列表初始化,将考虑显式和非显式构造函数,而copy-list-initialization只能调用非显式构造函数。对于这种情况(即std::vector
),实际结果是相同的。
- 因为第二个有一个赋值符号,所以我认为编译器会首先使用initializer_list创建一个临时向量,然后使用复制构造函数将临时向量复制到v2。这是事实吗?
醇>
没有。即使对于复制列表初始化,对象也将由适当的构造函数直接构造。对于这种情况,将创建一个临时std::initializer_list<int>
,然后调用std::vector::vector(std::initializer_list<T>, const Allocator& = Allocator())
来构建v2
。