αλεχολυτ Asked:2020-01-21 01:00:05 +0000 UTC2020-01-21 01:00:05 +0000 UTC 2020-01-21 01:00:05 +0000 UTC 用于声明从复合对象派生的变量的新语法 772 C++17 有一个新的语法来声明以下形式的变量: auto [x, y, z] = f(); 其中f()是返回复合对象(数组、元组、结构等)的函数。 这个语法叫什么,它有什么作用? c++ 1 个回答 Voted Best Answer αλεχολυτ 2020-01-21T01:00:05Z2020-01-21T01:00:05Z 这种构造称为结构化绑定声明(可以翻译为“结构化绑定的声明”)并允许您在存在初始化表达式的情况下一次声明一组变量(甚至可能是不同类型的变量)。该函数在示例中用作此表达式f。 让我们看几个使用示例: #include <iostream> #include <string> #include <tuple> #include <map> struct S { int i; std::string s; double d; }; S f() { return { 42, "hello", 1.5 }; } std::map<int, std::string> g() { return { { 1, "one" }, { 2, "two" }, { 3, "three" } }; } int main() { auto [i, s, d] = f(); std::cout << i << s << d << "\n"; int a[] = { 5, 6, 7 }; auto& [x, y, z] = a; std::cout << x << y << z << "\n"; x--; y++; z*=2; std::cout << a[0] << a[1] << a[2] << "\n"; auto [ss, dd, ii] = std::make_tuple("ololo", 0.5, 100500); std::cout << ss << dd << ii << "\n"; for (auto [k, v] : g()) { std::cout << "key=" << k << " value=" << v << "\n"; } } 执行结果: 42hello1.5 567 4714 ololo0.5100500 key=1 value=one key=2 value=two key=3 value=three 可以看出,变量i, s, 是d用结构体相应成员的值初始化的S。这里值得注意的是,重要的不是名字的巧合,而是成员的顺序。 当绑定变量x,,与数组元素时y,使用了一个引用。那。变量的后续变化会影响数组元素的状态。za& 变量ss, dd,ii用元组元素初始化。这里的一切似乎都很简单。 在范围循环中使用它可以让您立即将复合元素(在本例中std::pair为 )分解为组件。类似的 c++11 风格循环可能如下所示: for (auto e: g()) { std::cout << "key=" << e.first << " value=" << e.second << "\n"; } 那。当需要访问复合对象的各个部分时,此结构简化了代码编写。
这种构造称为结构化绑定声明(可以翻译为“结构化绑定的声明”)并允许您在存在初始化表达式的情况下一次声明一组变量(甚至可能是不同类型的变量)。该函数在示例中用作此表达式
f。让我们看几个使用示例:
执行结果:
可以看出,变量
i,s, 是d用结构体相应成员的值初始化的S。这里值得注意的是,重要的不是名字的巧合,而是成员的顺序。当绑定变量
x,,与数组元素时y,使用了一个引用。那。变量的后续变化会影响数组元素的状态。za&变量
ss,dd,ii用元组元素初始化。这里的一切似乎都很简单。在范围循环中使用它可以让您立即将复合元素(在本例中
std::pair为 )分解为组件。类似的 c++11 风格循环可能如下所示:那。当需要访问复合对象的各个部分时,此结构简化了代码编写。