std::tie 语法不清晰

Unclear syntax with std::tie

我正在阅读a bit about tuples

现在我不清楚以下语法:

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

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

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

std::tie(myint, std::ignore, mychar)的return类型是
std::tuple<int&, decltype((std::ignore)), char&>,其中int&是对myint的引用,char&是对mychar的引用。

mytuple 分配给此 returned 引用元组时,mytuple 中的每个值都分配给存储在 returned 中的相应引用元组。这具有更新 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&;

来自 cpp 参考 "Creates a tuple of lvalue references to its arguments or instances of std::ignore. "

从这个意义上说,这与您在

中分配给运算符 [] 的 return 值并没有什么不同
vec[3]=5;

我们不得不提到 C++17 具有结构化绑定 auto [a,b,c] =,并且

BUT what happens from a language point of view? We are somehow assigning to the return value of a function?

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

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

其次,函数可以 return 用户定义的类型,具有 = 可以在右值上调用的运算符实现:

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

后者是 std::tie 的情况。