据我所知,自C++11以来出现了一些概念: lvalue、rvalue、prvalue、xvalue等。
据我理解,如果一个函数返回一个局部变量,它应该是一个rvalue。
std::string func() { return std::string("abc"); }
auto ret = func(); // func returns a rvalue对于x值,std::move(x)是一种x值。
我想我是对的。
今天,我的同事告诉我,我们不能获得rvalue的地址,所以&func()是非法的,但是我们可以获得xvalue的地址。这是区分r值和x值的一种方法.
我刚试过了:int a = 1; std::cout << &std::move(a);。但是编译器说:
error: taking address of xvalue (rvalue reference)我的同事是错的吗?
更新
事实上,我的同事误解了“有身份”的含义和一元的&运算符,我被他搞糊涂了。
这里有一个关于这个问题的非常好的问题:"xvalue有身份“是什么意思?
发布于 2022-05-05 13:04:58
你的同事不对。C++总是需要一个lvalue才能与操作符的地址一起使用。这是在[expr.unary.op]/3中显式调用的。
一元
&运算符的操作数应为某种类型T的值。结果是一个prvalue。
如果标准使用的是glvalue而不是lvalue,那么它们是正确的,但是[fig:basic.lval]、lvalue和xvalue是glvalue的不同叶子,所以xvalue是不允许的。
https://stackoverflow.com/questions/72127603
复制相似问题