【发布时间】:2013-04-28 17:46:41
【问题描述】:
我知道,给定一个初始化转发/通用引用的表达式,左值被推断为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&& 相同。
【问题讨论】:
-
enable_if<is_rvalue_reference<T&&>, ...>可以。 :) 但至于为什么它被推断为T- 因为这就是它与左值引用一起工作的方式?T&->U参数 ->U&。特殊的是左值情况,而不是右值情况。
标签: c++ c++11 templates perfect-forwarding template-argument-deduction