我们可以取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] lvalue
和 xvalue
是不同的叶子glvalue
所以不允许 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 typeT
. The result is a prvalue.
如果标准使用 glvalue
而不是 lvalue
那么它们是正确的,但是根据 [fig:basic.lval] lvalue
和 xvalue
是不同的叶子glvalue
所以不允许 xvalue
。