繁体   English   中英

为什么在rvalue的情况下转发引用不演绎为rvalue引用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM