我们可以取xvalue的地址吗

Can we take the address of xvalue

据我所知,自 C++11 以来出现了一些概念:左值、右值、纯右值、x 值等。

据我理解,如果一个函数returns是一个局部变量,它应该是一个右值。

std::string func() { return std::string("abc"); }
auto ret = func(); // func returns a rvalue

而对于 xvalue,std::move(x) 是一种 xvalue。

我想我是对的。

今天同事告诉我,我们获取不到rvalue的地址,所以&func()是不合法的,但是我们可以获取xvalue的地址。这是区分右值和x值的方法...

嗯,我刚试过:int a = 1; std::cout << &std::move(a);。但是编译器说:

error: taking address of xvalue (rvalue reference)

所以我的同事错了吗?

更新

事实上,我的同事误解了“具有身份”和一元运算符 & 的含义,我被他弄糊涂了...

这里有一个关于这个问题的非常好的问题:

你的同事错了。 C++ 总是需要一个左值来与运算符的地址一起使用。这在 [expr.unary.op]/3:

中明确指出

The operand of the unary & operator shall be an lvalue of some type T. The result is a prvalue.

如果标准使用 glvalue 而不是 lvalue 那么它们是正确的,但是根据 [fig:basic.lval] lvaluexvalue 是不同的叶子glvalue 所以不允许 xvalue