§ 3.10.1.5
從標準定義prvalue
表達式爲:爲什麼函數表達式返回的非引用類型被認爲是prvalues而不是xvalues?
- 甲prvalue(「純」右值)是一個rvalue這不是一個x值。 [例子:調用返回類型不是引用的函數 的結果是一個前值。諸如12,7.3e5或true的文字的值也是 也是一個值。 - 端示例]
因此,功能foo()
是prvalue
表達式:
class Foo {};
Foo foo() { return Foo{}; }
要初始化lvalue reference to a non-volatile const type
/rvalue reference
初始化表達式必須是(§ 5.2.1.1
):
[。 ..]一個xvalue(但不是位字段),類prvalue,數組prvalue或函數左值和「cv1 T1」 是reference-compat用「CV2 T2」,或[...]
因此IBLE,
Foo &&rrFoo_ = foo();
是有效的代碼,其中rrFoo_
結合於臨時對象延伸的對象的生存期(§12.2
):
在各種上下文中創建臨時類類型:將參考綁定到prvalue(8.5.3),返回 prvalue(6.6.3),該值創建一個prvalue(4.1,5.2.9,5.2 .11,5.4),投擲一個例外(15.1), 和一些初始化(8.5)。
如上所述,忽略RVO,Foo
類型的對象的以下初始化將複製move構造臨時構造對象。這將被用來複制臨時對象移動構建名爲obj_foo
的最終目標:
Foo obj_foo{ foo() };
因此,在這兩種情況下,我們要麼從偷甚至延長壽命的臨時對象的,否則被銷燬。
§3.10.1.2
xvalues定義爲:
的x值(一個「到期」值)也指一個對象,通常接近其壽命的結束時(使得其 資源可以被移動,例如) 。 [...]
我不能想到任何情況下,沒有創建一個臨時對象。所以我的問題是,爲什麼像foo()
這樣的函數表達式被認爲是prvalue
表達式,即使認爲它們有至少類似的性質如xvalues
?
也可以編寫用戶定義的左值表達式和xvalue表達式:'int & f();','int && g();'。 –