[英]Why forwarding reference does not deduce to rvalue reference in case of rvalue?
我知道,给定一个初始化转发/通用引用的表达式,就可以得出左值是T&
类型T&
而右值是T
类型(而不是T&&
)。
因此,为了只允许右值,需要写
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) {}
我的问题是,为什么要转发引用,将右值推导为T
类型而不是T&&
? 我想,如果他们推导出T&&
然后也是相同的参考倒塌规则作品T&& &&
是一样T&&
。
因为当时将右值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年拍摄的收益/成本比相比。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.