我只是閱讀a bit about tuples。不明確的語法與標準::領帶
現在的語法如下是我不明白:
std::tie (myint, std::ignore, mychar) = mytuple;
這不是很難把握它做什麼,但從一個語言點,會發生什麼?我們以某種方式分配函數的返回值?
我只是閱讀a bit about tuples。不明確的語法與標準::領帶
現在的語法如下是我不明白:
std::tie (myint, std::ignore, mychar) = mytuple;
這不是很難把握它做什麼,但從一個語言點,會發生什麼?我們以某種方式分配函數的返回值?
但是從語言的角度來看會發生什麼?我們以某種方式分配函數的返回值?
是的,這可以是有效的,這取決於函數的返回類型。主要有兩種方法可以有效:首先,該函數可以返回一個對象的左值引用。
int i;
int &f() { return i; }
int main() { f() = 1; } // okay, assigns to i
其次,功能可與=
符實現,可以在右值被稱爲返回用戶定義類型:
struct S { void operator=(int) { } };
S f() { return {}; }
int main() { f() = 1; } // okay, calls S::operator=
後者是做什麼用std::tie
發生。
tie
返回引用的元組。您正在分配給該元組,這意味着元組成員分配(除std::ignore
d字段外)。由於該元組的元素實際上是引用,因此您將分配給綁定的元素。
的std::tie(myint, std::ignore, mychar)
返回類型是
std::tuple<int&, decltype((std::ignore)), char&>
,其中所述int&
是myint
基準和char&
是mychar
的參考。
當mytuple
被分配給這個返回的元組引用時,mytuple
中的每個值都被分配給存儲在返回元組中的相應引用。這具有更新myint
和mychar
的效果。
std::tie(myint, std::ignore, mychar) // <-- expression
std::tuple<int&, decltype((std::ignore)), char&> // <-- type
std::tie(myint, std::ignore, mychar) = mytuple;
std::tuple<int&, decltype((std::ignore)), char&> = std::tuple<int, T, char>&;
// functions as
std::tuple<int , T , char >&
// ↓↓ = = = ↓↓
std::tuple<int&, decltype((std::ignore)), char&>
// end result:
myint = std::get<0>(mytuple);
mychar = std::get<2>(mytuple);
int& = int&;
char& = char&;
'decltype(std :: ignore)&'(或'decltype((std :: ignore))')。 。 –
@ T.C。 : 確實!謝謝。 – ildjarn
從CPP參考「創建左值引用的元組的參數或性病的情況::忽視。」
在這個意義上,它不是從您指定的返回值是不同的操作符[]在
vec[3]=5;
我們只需要提及的是C++ 17已經構建綁定auto [a,b,c] =
和std::ignore with structured bindings?
請注意,對於C++'struct'和'class'es,直到右值引用'* this'出現在C++ 11中,即使是暫時的!即使結果被丟棄,「operator =」也可以工作。這裏有趣的部分是,分配給'tie'確實有用*。 – Yakk