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)
我的问题是:
这两者有区别吗?我知道第一个必须是列表初始化,但第二个怎么样?
因为第二个有一个赋值符号,所以我认为编译器会首先使用它std::initializer_list来创建一个临时符号vector,然后使用复制构造函数将temp复制vector到v2.这是事实吗?
在这种情况下,两者(直接列表初始化与复制列表初始化)完全相同.没有临时std::vector建造,也没有std::vector::operator=被召唤.等号是初始化语法的一部分.
如果std::vector构造函数重载没有,那将会有所不同.标记为7explicit,在这种情况下,任何复制初始化都会失败,但这将是标准库设计中的一个缺陷.
它们都是列表初始化(从C++ 11开始).第一个是直接列表初始化,第二个是复制列表初始化.
- 这两者有什么区别吗?
对于直接列表初始化,将考虑显式和非显式构造函数,而可能仅调用复制列表初始化非显式构造函数.对于这种情况(即std::vector),实际结果是相同的.
- 因为第二个有一个赋值符号,所以我认为编译器会首先使用initializer_list创建一个临时向量,然后使用复制构造函数将临时向量复制到v2.这是事实吗?
不.即使对于复制列表初始化,对象也将由适当的构造函数直接构造.对于这种情况,std::initializer_list<int>将创建一个临时的,然后std::vector::vector(std::initializer_list<T>, const Allocator& = Allocator())将调用它来构造v2.
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |