我一直在思考什么时候编译器会确定一个特定的函数参数是一个右值引用,什么时候它会确定它是一个左值引用。
我假设您正在谈论具有通用参考参数的函数模板,像这样?
template<typename T>
void foo(T&& t)
{
}
规则非常简单。如果参数是类型的右值X
,那么T
将被推断为是X
,因此T&&
意味着X&&
。如果参数是类型的左值X
,那么将推T
导出为X&
,因此T&&
意味着X& &&
,它被折叠成X&
。
如果你真的在问arguments,那么这个问题没有多大意义,因为 arguments 从来都不是左值引用或右值引用,因为 type 的表达式X&
会立即转换为 type 的表达式X
,它表示引用的对象。
但是,如果您实际上的意思是“编译器如何区分左值参数和右值参数?” (注意缺少的参考),那么答案很简单:编译器知道每个表达式的值类别,因为标准为每个可能的表达式指定了它的值类别是什么。例如,函数的调用是可以属于以下三个值类别之一的表达式:
X foo(); // the expression foo() is a prvalue
X& bar(); // the expression bar() is an lvalue
X&& baz(); // the expression baz() is an xvalue
(当然,前提是它X
本身不是引用类型。)
如果这些都不能回答您的问题,请澄清问题。此外,有些相关的常见问题解答。