我只是在阅读a bit about tuples。
现在我不清楚以下语法:
std::tie (myint, std::ignore, mychar) = mytuple;
不难理解它的作用,但从语言的角度来看会发生什么?我们以某种方式分配函数的返回值?
答案 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
中的每个值都将分配给存储在返回的元组中的相应引用。这样可以更新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&;
答案 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?