【发布时间】:2026-02-16 11:50:01
【问题描述】:
阅读this question 的答案后,我惊讶地发现std::min(std::initializer_list<T>) 按值接受它的参数。
如果您按照其名称所暗示的方式使用std::initializer_list,即作为某个对象的初始化程序,我知道我们不关心复制其元素,因为无论如何它们都会被复制以初始化对象。但是,在这种情况下,我们很可能不需要任何副本,因此如果可能的话,将参数设为 std::initializer_list<const T&> 似乎更合理。
这种情况的最佳做法是什么?如果您不想制作不必要的副本,您是否应该不调用initializer_list 版本的std::min,或者是否有其他技巧可以避免复制?
【问题讨论】:
-
AFAIK,使用引用比传递
int的副本需要更多的 CPU 周期,并且比传递更小的变量需要更多的内存(至少在 x86 上)。 -
我认为原因在N2722 中有所描述,尽管我不愿意相信性能比较和结论。可能会有更多的讨论记录在某个地方。
-
@dyp 顺便说一句,在 n2772_fix 中它说可变参数模板优先于 initializer_list。为什么标准委员会决定用 initializer_list 而不是可变参数模板定义 std::min?
-
@dyp:链接已损坏,论文现在在这里:open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2722.pdf。
标签: c++ c++11 std min c++-standard-library