std :: tie的语法不清楚

时间:2016-11-20 21:42:03

标签: c++ c++11 stl stdtuple

我只是在阅读a bit about tuples

现在我不清楚以下语法:

std::tie (myint, std::ignore, mychar) = mytuple;

不难理解它的作用,但从语言的角度来看会发生什么?我们以某种方式分配函数的返回值?

4 个答案:

答案 0 :(得分:6)

  

但从语言的角度来看会发生什么?我们以某种方式分配函数的返回值?

是的,这可能有效,具体取决于函数的返回类型。它主要有两种有效的方式:首先,函数可以返回对象的左值引用。

int i;
int &f() { return i; }
int main() { f() = 1; } // okay, assigns to i

其次,函数可以返回用户定义的类型,其中=运算符实现可以在rvalues上调用:

struct S { void operator=(int) { } };
S f() { return {}; }
int main() { f() = 1; } // okay, calls S::operator=

后者是std::tie发生的事情。

答案 1 :(得分: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&;

答案 2 :(得分:3)

tie返回一个引用元组。您正在分配给该元组,这意味着元组成员分配(std::ignore d字段除外)。因为元组的元素实际上是引用,所以你要分配给绑定的元素。

答案 3 :(得分:2)

来自cpp引用“创建一个左值引用元组,引用它的参数或std :: ignore的实例。”

从这个意义上讲,它与分配给operator []的返回值时没有区别,如

vec[3]=5;

我们只需要提一下,C ++ 17具有结构化绑定auto [a,b,c] =std::ignore with structured bindings?