Mic*_*ael 3 c++ stl c++11 stdtuple
我只是读一些关于元组的内容.
现在我不清楚以下语法:
std::tie (myint, std::ignore, mychar) = mytuple;
Run Code Online (Sandbox Code Playgroud)
掌握它的作用并不难,但从语言的角度来看会发生什么?我们以某种方式分配函数的返回值?
小智 6
但从语言的角度来看会发生什么?我们以某种方式分配函数的返回值?
是的,这可能是有效的,具体取决于函数的返回类型.它主要有两种有效的方式:首先,函数可以返回对象的左值引用.
int i;
int &f() { return i; }
int main() { f() = 1; } // okay, assigns to i
Run Code Online (Sandbox Code Playgroud)
其次,函数可以返回用户定义的类型,其中的=运算符实现可以在rvalues上调用:
struct S { void operator=(int) { } };
S f() { return {}; }
int main() { f() = 1; } // okay, calls S::operator=
Run Code Online (Sandbox Code Playgroud)
后者是正在发生的事情std::tie.
返回类型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&;
Run Code Online (Sandbox Code Playgroud)