在rvalue的情况下,为什么转发引用不会推导到rvalue引用?

时间:2013-05-04 11:41:33

标签: c++ c++11 templates perfect-forwarding template-deduction

我理解,给定一个初始化转发/通用引用的表达式,推导出左值为T&的类型和类型为T的rvalues(而不是T&&)。

因此,只允许rvalues,需要编写

template<class T, enable_if<not_<is_lvalue_reference<T> >,OtherConds... > = yes>
void foo(T&& x) {}

而不是,

template<class T, enable_if<is_rvalue_reference<T>,OtherConds... > = yes>
void foo(T&& x) {}

我的问题是,为什么转发参考,rvalues推断为T而不是T&&?我想,如果它们被推断为T&&,则同样引用折叠规则的工作方式与T&& &&相同,与T&&相同。

1 个答案:

答案 0 :(得分:2)

因为当时将A参数推断为A&&而不是A被视为不必要的并发症,并且偏离正常的扣除规则:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm

我们甚至不知道我们是否可以得到扣除规则的一个例外(对于左值A的情况),我们甚至从未想过我们敢于要求两个例外。要做到这一点,必须有以下好处:它使不可能的事情成为可能。

毕竟,如果没有针对左值的单一特殊扣除规则,完全转发是不可能的,正如N1385所说明的那样。

即使有今天的后见之明,添加另一个特殊的扣除规则,以便客户端可以避免否定模板约束,似乎不是一个非常高的收益/成本比率。特别是与我们2002年拍摄的效益/成本比相比。