2017-01-21 25 views
3

如果您使用的結構化綁定,像這樣結構綁定和強制複製省略

auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s); 

然後將返回的元組的副本被省略和對象直接進入abc或將初始化是舉來自單個元組元素的構造?我懷疑這會造成副本的發生,但我不確定標準中的強制副本的描述是否處理這種情況。

+0

「將從返回的元組中刪除副本,並且對象直接進入a,b和c」否「,將初始化爲單個元組元素的移動構造」No. – cpplearner

+0

@carraarner然後將它們複製? – Curious

回答

4

所涵蓋的this excellent answer,該聲明等同於:

auto e = std::make_tuple(1, 10.0, "string object"s); 
int& a = get<0>(e); 
double& b = get<1>(e); 
std::string& c = get<2>(e); 

,只是沒有一個名字e。在這種情況下,get函數產生對所選項目的左值引用。

在C++ 17,auto name = prvalue;is defined來聲明對象稱爲與prvalue表達初始化decltype(prvalue)類型的name - 沒有中間臨時這是elidable如在以前的版本。

換句話說,所述e聲明行爲完全一樣:

std::tuple<int, double, std::string> e {1, 10.0, "string object"s}; 

然後a,b,c是該元組中的元素的引用。


注:以上解釋對應於最新的C++ 17草案來源;在C++ 17完成之前,行爲可能會發生變化。

+0

在這個例子中,'a','b','c'是'&&'和'get'是相當於'std :: move(e)'調用的。 –

+0

@ T.C。 'e'是一個左值,所以'得到(e)'應該是接受左值引用並返回左值引用的版本? (但即使你是對的,最終的結果也是一樣的,因爲a,b,c也是左值)。 [dcl.decomp/3]當前說「否則,初始化程序就是'get (e)'」 –

+1

這裏的措辭是非常棘手的。關鍵句是「在任何一種情況下,如果實體」e「的類型是左值引用,則」e「是左值,否則是」左值「。 –