未命名的对象和临时对象是否相同?

Dan*_*aum 7 c++

在我理解rvalue引用的过程中,我一直在思考编译器何时确定一个特定的函数参数是一个右值引用,以及何时它将它确定为一个左值引用.

(此问题与参考折叠有关;请参阅所请求的参考折叠规则的简明说明:(1)A && - > A&,(2)A &&& - > A&,(3)A &&& - > A&,以及(4)A && && - > A &&).

特别是,我一直在考虑编译器是否总是将未命名对象视为rvalue引用和/或编译器是否始终将临时对象视为rvalue引用.

反过来,这使我怀疑未命名的对象是否等同于临时对象.

我的问题是:未命名的对象总是暂时的; 并且是永远未命名的临时对象?

换句话说:未命名的对象和临时对象是否相同

fre*_*low 2

我一直在思考编译器何时会确定特定的函数参数是右值引用,以及何时会确定它是左值引用。

我假设您正在谈论具有通用参考参数的函数模板,就像这样?

template<typename T>
void foo(T&& t)
{
}
Run Code Online (Sandbox Code Playgroud)

规则非常简单。如果参数是类型的右值X,则将T被推导出为X,因此T&&意味着X&&。如果参数是 类型的左值X,则将T被推导为X&,因此T&&意味着X& &&,它被折叠为X&

如果您真的在询问arguments,那么这个问题没有多大意义,因为 argument 永远不是左值引用或右值引用,因为 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
Run Code Online (Sandbox Code Playgroud)

(当然,前提是它X本身不是引用类型。)

如果这些都不能回答您的问题,请澄清问题。另外,有些相关的常见问题解答