当我试图理解现代 C++ 中不同类型的初始化时,我遇到std::vector<T>了初始化列表的初始化。允许使用初始化程序列表数据结构进行初始化,例如std::vector<T>应该有一个接受初始化程序作为参数的构造函数。我观察到的是std::vector<T>通过复制接受初始化列表而不是作为参考,当我们有大量元素时通过复制接受可能非常昂贵。为什么是这样,为什么初始化列表将其作为副本而不是引用有什么特殊原因?
来自https://en.cppreference.com/w/cpp/container/vector/vector
vector( std::initializer_list<T> init, … ); (9) (since C++11)
Run Code Online (Sandbox Code Playgroud)
为什么不?
vector( std::initializer_list<T>& init, … );
Run Code Online (Sandbox Code Playgroud)
小智 3
据cppreference.com报道,
类型的对象
std::initializer_list<T>是一个轻量级代理对象,它提供对类型的对象数组的访问const T。初始化列表可以被实现为一对指针或者指针和长度。复制 a
std::initializer_list不会复制底层对象。
因此,尽管创建了一个临时数组,但即使按值传递,std::initializer_list该数组的元素也不会被复制。std::initializer_list但如果您愿意,您可以通过常量引用接受这种类型的对象。这在我的项目中效果很好。例如:
auto some_function(const std::initializer_list<T>& list);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |