據我所知,自 C 11 以來就出現了一些概念:左值、右值、純右值、xvalue 等。
據我了解,如果一個函式回傳一個區域變數,它應該是一個右值。
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)
那我同事有錯嗎?
更新
事實上,我的同事誤解了“有身份”和一元運算子的含義,&我被他弄糊涂了……
這是關于這個問題的一個非常好的問題:“xvalue has identity”是什么意思?
uj5u.com熱心網友回復:
你的同事不正確。C 一直需要一個左值來與運算子的地址一起使用。這在[expr.unary.op]/3中明確指出:
一元運算
&符的運算元應該是某種型別的左值T。結果是prvalue。
如果使用標準glvalue而不是lvaluethen 它們將是正確的,但根據[fig:basic.lval] lvalue并且xvalue是glvaluesoxvalue的不同葉子是不允許的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469964.html
