【发布时间】:2018-10-29 12:47:46
【问题描述】:
想知道下面两种std::vector在C++11及以后的初始化有什么区别。
std::vector<int> v1 {1, 2, 3, 4, 5};
std::vector<int> v2 = {1, 2, 3, 4, 5};
这是一个运行良好的完整代码示例。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v1 {1, 2, 3, 4, 5};
std::vector<int> v2 = {1, 2, 3, 4, 5};
std::cout << v1.size() << '\n';
std::cout << v2.size() << '\n';
}
我看到两个初始化都导致相同的结果。
http://en.cppreference.com/w/cpp/container/vector 的示例使用了第二种,这让我开始思考这种初始化是否有任何优势。
一般来说,我想知道一种初始化是否比另一种具有特定的技术优势,或者一种初始化是否被认为是最佳实践而另一种则不是,如果是,为什么。
我特别关心的是copy-list-initialization是否会因为临时对象和复制而产生额外的开销?
【问题讨论】:
-
第一个叫做direct-list-initialization,第二个叫做copy-list-initializaiton。对于
vectorhwoever,这两件事的行为完全相同 -
@M.M 是否存在 copy-list-initialization 的行为可能与 direct-list-initialization 不同的情况? copy-list-initialization 中是否有任何复制会导致它变慢?
-
@LoneLearner 这取决于所涉及的标准版本(C++14 中的一些相关更改在这里发挥作用)
-
@Frank 如果更改可以简明扼要地解释,我们能否有一个答案来解释 direct-list-initialization 和 copy-list-initialization 在 C++11、C++14 和 C++17 中?如果答案过于宽泛和冗长,那么我将不得不将其分成三个问题,我不确定这些问题是否合适。
-
可能值得注意的是,different compilers 编译为与上述示例相同的代码。
标签: c++ c++11 initialization c++14 c++17