【发布时间】:2020-08-03 17:07:28
【问题描述】:
作为一名 C++ 程序员,我被教导了传递参数的简单规则:
在
sizeof(T) <= sizeof(void*)时按值传递参数T或就地构建并移入。
但是,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不是容器,旨在按值传递。现在很多人认为这是一个错误 -
@MM 有趣。你能指点我们讨论一下吗?
-
initializer_list始终被设计为数组而不是容器的“轻量级包装器”(如果我没记错的话)。这通常意味着复制的开销——包括按值传递——是可以接受的低。这可以解释为什么标准库通过值而不是引用来传递它们。至于这被认为是一个错误 - 我会对此进行讨论。 -
我不确定我是否理解这个问题。您的问题似乎是“我有这个规则,而 C++ 标准库不遵循这个规则。为什么不呢?”标准库是否需要有理由不遵循您的规则?此外,标准库还有许多其他地方不遵循您的规则(例如,每个采用谓词或其他可调用对象的算法都按值这样做)。
标签: c++ c++11 pass-by-reference standards pass-by-value