【发布时间】:2017-10-13 06:04:28
【问题描述】:
提到 here 和 there 有时最好按值传递而不是按引用传递。
鉴于此,是否可以结合完美的转发可变参数模板选择某些类型进行值传递?
template<typename... Args>
void foo(Args&&...); // passes everything by reference
template<typename... Args>
void foo(Args...); // passes everything by value
template<typename... Args>
void foo(std::conditional_t<is_selected_v<Args>, Args, Args&&>...); // won't deduce types
template<typename... Args>
void foo(...); // this is wrong :)
注意不能推断类型意味着它不适用于构造函数
【问题讨论】:
-
嗯,我认为当内联是可能的/可能时,几乎总是使用完美的转发函数,这使得传递值的需要远不那么明显......
-
如果满足某些条件,您是要按值传递所有参数,还是要按值传递一些参数和通过引用传递一些参数?后者似乎不可能......
-
@Knoep 后者。我想不出任何可以做到这一点的东西,因此提出了这个问题
-
@MassimilianoJanes 我不知道优化器是如何工作的,但我猜大型函数不会经常被内联。或重度递归函数
-
如果函数是“大”的,那么链接中提到的按值传递的理由不适用。请注意,如果在合理的情况下没有内联(和优化)完美的转发函数,那么大多数基于它的模板魔法在实践中将毫无用处......
标签: c++ templates perfect-forwarding