我有一个类似于5年前发布的这个问题的问题:
为什么rvalue引用变量不是rvalue?我的主要问题是为什么我可以这样做:
int&& k = 3;
k++;
但是我做不到这点:(static_cast<int&&>(3))++;
我一直将右值引用解释为左值,因为右值引用变量是左值。但显然并非如此。有人能向我解释为什么(static_cast<int&&>(3))++;
的结果是using rvalue as lvalue
吗?
我有一个类似于5年前发布的这个问题的问题:
为什么rvalue引用变量不是rvalue?我的主要问题是为什么我可以这样做:
int&& k = 3;
k++;
但是我做不到这点:(static_cast<int&&>(3))++;
我一直将右值引用解释为左值,因为右值引用变量是左值。但显然并非如此。有人能向我解释为什么(static_cast<int&&>(3))++;
的结果是using rvalue as lvalue
吗?
r-value
和r-value引用
的区别。前者是一个值类别,仅适用于表达式,而后者是一个类型,适用于变量(技术上需要某种类型的r-value引用,例如r-value引用到int)。operator++
要求操作数的值类别为l-value,而不管操作数的类型如何。k++
中,表达式k
是l-value(粗略地说,它有一个名称),这是它的值类别。变量k
的类型是r-value引用,但这没问题。(static_cast<int&&>(3))++
中,表达式static_cast<int&&>(3)
是一个r-value(它没有名称),这是它的值类别。无论static_cast<int&&>
的类型是什么(它是int
),值类别都是错误的,因此您会收到错误消息。using rvalue as lvalue
指的是正在使用的表达式的值类别。它与变量的类型无关。
k
的类型为int &&
,但表达式k
的类型只是int
(并且该表达式是左值)。这也意味着static_cast<int&&>(3)
的类型是int
而不是int &&
。 - HolyBlackCat(static_cast<int&>(k))++
能够工作,其中k
是某个 int 变量?我知道该表达式返回 k 的引用,而引用被定义为对象的另一个名称,但是static_cast<int&>
和static_cast<int&&>
之间有什么区别呢?两者都返回引用,对吧?总之,为什么表达式static_cast<int&>
有一个名称? - domdragstatic_cast<int&&>(3)
是右值?你说过原因是它没有名字。这也有道理。但是,对我来说不合理的是为什么表达式static_cast<int&>(k)
有一个名字? - domdrag