std::tie 语法不清晰
Unclear syntax with std::tie
我正在阅读a bit about tuples。
现在我不清楚以下语法:
std::tie (myint, std::ignore, mychar) = mytuple;
理解它的作用并不难,但是从语言的角度来看会发生什么?我们以某种方式分配给函数的 return 值?
tie
returns 一个引用元组。您正在分配给该元组,这意味着元组成员分配( std::ignore
d 字段除外)。因为该元组的元素实际上是引用,所以您要分配给绑定的元素。
std::tie(myint, std::ignore, mychar)
的return类型是
std::tuple<int&, decltype((std::ignore)), char&>
,其中int&
是对myint
的引用,char&
是对mychar
的引用。
当 mytuple
分配给此 returned 引用元组时,mytuple
中的每个值都分配给存储在 returned 中的相应引用元组。这具有更新 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&;
来自 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
的情况。
我正在阅读a bit about tuples。
现在我不清楚以下语法:
std::tie (myint, std::ignore, mychar) = mytuple;
理解它的作用并不难,但是从语言的角度来看会发生什么?我们以某种方式分配给函数的 return 值?
tie
returns 一个引用元组。您正在分配给该元组,这意味着元组成员分配( std::ignore
d 字段除外)。因为该元组的元素实际上是引用,所以您要分配给绑定的元素。
std::tie(myint, std::ignore, mychar)
的return类型是
std::tuple<int&, decltype((std::ignore)), char&>
,其中int&
是对myint
的引用,char&
是对mychar
的引用。
当 mytuple
分配给此 returned 引用元组时,mytuple
中的每个值都分配给存储在 returned 中的相应引用元组。这具有更新 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&;
来自 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
的情况。