2017-04-11 25 views
0

假設你有這樣的代碼(在C++ 14):終身臨時右值引用的對象

auto && a = a_function_returning_a_temp_rvalue(); 

在哪裏存儲返回值的時候,就是它的析構函數調用,是aconst(考慮功能沒有按不會返回const),它是如何在標準中指定的? (是它甚至是法律)

另外,你確認,暫時真的勢必a,並沒有operator=既不構造會叫什麼名字?

它編譯於G ++和避免打字長模板類,但在使用它之前,我想檢查它是否在C明確提出++ 14

+0

'auto'作爲模板參數的扣除,除了一些例外。 – 101010

+0

我知道,但我想知道右值的一生(我想,因爲它必然是'a',它和'a'一樣,但我想知道它在標準中的表達方式和位置) –

回答

1

是的,這是保證工作。

[12.2/4-5]

有兩個上下文,其中的臨時被在不同的點比全表達的端部銷燬。 ...

第二個上下文是當引用綁定到臨時。臨時到該參考結合或臨時即其上結合的參考持續基準的除了壽命的子對象的完整的對象:

  • 的臨時對象綁定到一個基準參數一個函數調用一直持續到包含該調用的完整表達式的完成。

  • 臨時綁定到函數返回語句中的返回值的生命週期不會被擴展;在return語句的完整表達式的末尾臨時被銷燬。

  • 臨時結合到在新初始化基準持續直到含有新初始化全表達的完成。

沒有構造函數或operator=被稱爲初始化a,並且a不是const如果沒有需要的人。

2

規則是在[class.temporary]:

有三個上下文,其中的臨時被在不同的點比全表達的端部銷燬。 [...]第三個上下文是當一個引用綁定到一個臨時對象時.111引用是 綁定的臨時對象或臨時引用綁定到的子對象的完整對象在整個生命週期中一直存在參考除外:
- 在函數調用中綁定到參考參數的臨時對象(5.2.2)
- 函數返回語句中返回值的臨時綁定的生命週期( 6.6.3)是
- 在新初始化程序(5.3.4)中引用的臨時綁定一直存在,直到[...]]

在這個例子中:

auto && a = a_function_returning_a_temp_rvalue(); 

我假定該函數返回T型(相對於T&T&&)的東西。在這種情況下,我們確實有參考的臨時綁定,並且這些例外都不適用。因此,該臨時生命週期在a的生命週期中延長。