我理解,给定一个初始化转发/通用引用的表达式,推导出左值为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&&
相同。
答案 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年拍摄的效益/成本比相比。