如果您使用的結構化綁定,像這樣結構綁定和強制複製省略
auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s);
然後將返回的元組的副本被省略和對象直接進入a
,b
和c
或將初始化是舉來自單個元組元素的構造?我懷疑這會造成副本的發生,但我不確定標準中的強制副本的描述是否處理這種情況。
如果您使用的結構化綁定,像這樣結構綁定和強制複製省略
auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s);
然後將返回的元組的副本被省略和對象直接進入a
,b
和c
或將初始化是舉來自單個元組元素的構造?我懷疑這會造成副本的發生,但我不確定標準中的強制副本的描述是否處理這種情況。
所涵蓋的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完成之前,行爲可能會發生變化。
在這個例子中,'a','b','c'是'&&'和'get'是相當於'std :: move(e)'調用的。 –
@ T.C。 'e'是一個左值,所以'得到
這裏的措辭是非常棘手的。關鍵句是「在任何一種情況下,如果實體」e「的類型是左值引用,則」e「是左值,否則是」左值「。 –
「將從返回的元組中刪除副本,並且對象直接進入a,b和c」否「,將初始化爲單個元組元素的移動構造」No. – cpplearner
@carraarner然後將它們複製? – Curious