2017-02-04 27 views
6

§ 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

+0

也可以編寫用戶定義的左值表達式和xvalue表達式:'int & f();','int && g();'。 –

回答

2

鑑於int f1()int && f2(),它的意圖是decltype(f1())int,而decltype(f2())int &&。這是工作的方式是通過指定f1()是一個prvalue和f2()是一個xvalue。 decltype然後查看給定的表達式是否是一個prvalue,xvalue或者左值。如果f1()f2()都是x值,那麼相同的區別仍然需要以其他方式進行。

相關問題