提问人:xmllmx 提问时间:4/21/2020 最后编辑:xmllmx 更新时间:4/21/2020 访问量:102
为什么C++标准库总是按值而不是引用传递 std::initializer_list<T>?
Why does the C++ standard library always pass std::initializer_list<T> by value rather than by reference?
问:
作为一名C++程序员,我被教导了传递参数的简单规则:
当或用于就地构建和移入时按值传递参数。
T
sizeof(T) <= sizeof(void*)
但是,C++ 标准库似乎不符合该规则。例如,大于 ,但具有构造函数:sizeof(std::initializer_list<T>)
sizeof(void*)
std::vector
vector(std::initializer_list<T>, const Allocator&);
为什么 C++ 标准库总是按值传递而不是按引用传递?std::initializer_list<T>
答:
2赞
Jean-Marc Volle
4/21/2020
#1
由于在初始化范围内已知值将用作(即复制)作为容器的属性(例如向量,map,...),因此通过引用传递它们不会提高性能。
2赞
Alex Guteniev
4/21/2020
#2
从 cppreference on initializer_list:
基础数组的生存期与任何其他临时对象相同,只是从数组初始化initializer_list对象会延长数组的生存期,就像将引用绑定到临时对象一样(但有相同的例外,例如初始化非静态类成员)。
所以已经像是对临时的引用。initializer_list
其背后的想法是将数据从临时存储器中移动或将其从只读内存直接复制到目标容器。它本身不是一个容器。initializer_list
上一个:丢失对容器内对象的引用
评论
initializer_list
不是容器,而是设计为按值传递。现在很多人认为这是一个错误initializer_list
总是被设计为数组的“轻量级包装器”(如果我没记错的话),而不是容器。这通常意味着复制的开销(包括按值传递)是可以接受的低。这可以解释为什么标准库通过值而不是引用来传递它们。至于这被认为是一个错误 - 我对这个问题的讨论很感兴趣。