作为C ++程序员,我已经学会了传递参数的简单规则:
通过
T
时的值或通过就地构造并移入的值传递参数sizeof(T) <= sizeof(void*)
。
但是,C ++标准库似乎不符合该规则。对于example,sizeof(std::initializer_list<T>)
大于sizeof(void*)
,但是std::vector
具有构造函数:
vector(std::initializer_list<T>, const Allocator&);
为什么C ++标准库总是通过std::initializer_list<T>
按值而不是按引用?
从initializer_list上的cppreference:
基础数组的生存期与任何其他临时对象相同,不同之处在于,从数组初始化initializer_list对象会延长数组的生存期,就像将引用绑定到临时对象一样(例外,例如用于初始化的相同)非静态的类成员)。
所以initializer_list
已经像引用临时文件一样。
initializer_list
的想法是从临时数据中移动数据或将其从只读存储器直接复制到目标容器。它本身不是容器。
由于在初始化范围内,已知将值(即复制的)用作容器的属性(例如,矢量,地图等),因此通过引用传递它们不会提高性能。