C++ 所有右值引用都是左值吗?

C++ 所有右值引用都是左值吗?,c++,c++11,rvalue-reference,C++,C++11,Rvalue Reference,鉴于代码: void foo( int&& i ) { int* p = &i; } i是左值。事实上,我可以通过&操作符获取它的地址 此语句正确吗?表达式的值类别将从其类型中完全删除 在您的例子中,表达式i是左值,而std::move(i)是右值。右值引用类型的表达式可以是左值或右值。引用是一种类型,而不是值。所以这个问题毫无意义。正确的说法是,计算一个类型为右值引用的id表达式会产生一个左值。@KerrekSB好吧,也许这句话没有意义,但阅读我认为问题did

鉴于代码:

void foo( int&& i )
{
    int* p = &i;
}
i
是左值。事实上,我可以通过
&
操作符获取它的地址


此语句正确吗?

表达式的值类别将从其类型中完全删除


在您的例子中,表达式
i
是左值,而
std::move(i)
是右值。右值引用类型的表达式可以是左值或右值。

引用是一种类型,而不是值。所以这个问题毫无意义。正确的说法是,计算一个类型为右值引用的id表达式会产生一个左值。@KerrekSB好吧,也许这句话没有意义,但阅读我认为问题did@PaoloM通用引用(或你想叫它们的任何东西)是不同的。@布莱克,通用引用不是右值引用。在推导类型之前,它们只在类型后面加上&。我错了吗?@黑色转发(“通用”)引用仅存在于模板和语法中。一旦实例化,它要么是左值引用,要么是右值引用。“表达式的值类别将从其类型中完全删除。”这可能有点过于笼统。例如,
int&foo()
,可以说
foo()
的初始类型是
int&
,该类型决定了此函数调用表达式的值类别。也就是说,我们无法从表达式的“观察”类型得出表达式具有什么样的值类别。