2017-03-17 41 views
0

在這種情況下會發生什麼?將一個右值賦給'const auto'時會發生什麼

// assume WeakPtr is valid and has not expired 
const auto& something = WeakPtr.lock(); 
something->doStuff(); 

這是undefined?

它在這種情況下會改變嗎?

std::shared_ptr<Something> getSomething() { return mSomething.lock(); } 
const auto& something = getSomething(); 

這又怎麼樣?

std::vector<int> getInts() { return std::vector<int>{ 1, 2, 3 }; } 
const auto& ints = getInts(); 

在每種情況下const auto&意味着我要綁定到的對象的引用,但在每一種情況下,我將它綁定到一個臨時右值對象。我是否在邀請災難?

+0

整潔如何問題像這樣聚集起來:http://stackoverflow.com/questions/42868517/why-can-you-intialize-a-const-reference-but-not-a-non-const-reference -from-an-rv一些有用的評論關於什麼和什麼因素。 – user4581301

+0

重要的是要注意「臨時」和「右值」之間的區別。後者是嚴格更一般的。例如,比較'const int&r = 5;'和'const int&q = std :: move(5);'。兩者都是rvalues,一個是災難。 –

回答

1

這是undefined?

每種情況都有明確的定義。

在這種情況下會發生什麼?

在每種情況下,臨時對象的生命週期都會延長到與const引用的生存期匹配,如標準的[class.temporary]部分所述。

[class.temporary](標準草案)

4存在其中的臨時被在不同的點比全 表達式的結尾破壞兩個上下文。第一個上下文是... [與您的案例無關]

5第二個上下文是引用綁定到臨時的時候。參考文件爲 的臨時文件或作爲引用所綁定的子對象的完整對象的臨時文件在參考文獻的生存期內持續存在 ,除非... [一些例外情況不適用於您的個案]

+0

_「每種情況都有明確的定義。」_不,它取決於'WeakPtr.lock()'和'mSomething.lock()'的返回。最後的情況是唯一明確定義的情況。 –

+0

基本上,它是明確的_iff_對本地的引用不被返回。基本上。 –

+0

@BoundaryImposition在這種情況下,當函數返回一個臨時對象,一個右值,如問題中所述,它沒有很好的定義?參考(對本地或其他地方)是一個左值。 – user2079303

相關問題