std :: tie的语法不清楚

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.


ild*_*arn 5

返回类型std::tie(myint, std::ignore, mychar)
std::tuple<int&, decltype((std::ignore)), char&>,其中int&是对引用的引用,myint并且char&是对引用的引用mychar.

mytuple为这个返回的引用元组赋值时,每个值都mytuple被分配给存储在返回元组中的相应引用.这具有更新myintmychar到位的效果.

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)