关于c ++:不是xvalues都是glvalues和rvalues吗?


Aren't xvalues both glvalues and rvalues?

我读到这个答案,引起我注意的部分是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int i;
int* p = &i;
int& f();
int&& g();

int h();

h() // prvalue
g() // glvalue (xvalue)
f() // glvalue (lvalue)
i   // glvalue (lvalue)
*p  // glvalue (lvalue)

std::move(i)  // glvalue (xvalue)

考虑到这个图表

Expression type chart

我搞糊涂了。

如果glvalue是lvalue或xvalue,而rvalue是prvalue或xvalue,那么说g()是glvalue而不说它也是rvalue是不对的?同std::move(i)

上面代码的我的版本是什么样子的:

1
2
3
4
5
6
7
h() // rvalue (prvalue)
g() // glvalue and rvalue (xvalue)
f() // glvalue (lvalue)
i   // glvalue (lvalue)
*p  // glvalue (lvalue)

std::move(i)  // glvalue and rvalue(xvalue)

至于标准的内容(我只引用最相关的部分):

An rvalue (so-called, historically, because rvalues could appear on
the right-hand side of an assignment expression) is an xvalue

A glvalue ("generalized" lvalue) is an lvalue or an xvalue.

当然,我可能错了。如果是,请帮我一点。)


If a glvalue is either an lvalue or an xvalue and an rvalue is either a prvalue or an xvalue, isn't it wrong to say that g() is a glvalue without saying that it is also an rvalue?

对。

如果g()是xvalue,那么它既是glvalue又是rvvalue。


据我所知

  • glvalue==具有标识和
  • rValue==可以从移动。

所以您的分析是正确的,因为XValue

  • 可以从和移动
  • 具有身份。