结构化绑定声明,是指在一次声明中同时引入多个变量,同时绑定初始化表达式的各个子对象的语法形式。
结构化绑定声明使用auto来声明多个变量,所有变量都必须用中括号括起来。
cv-auto+引用 [变量1, 变量2, ... 变量n ] = 初始化表达式;
cv-auto+引用 [变量1, 变量2, ... 变量n ] (初始化表达式);
cv-auto+引用 [变量1, 变量2, ... 变量n ] {初始化表达式};
// 这里 cv-auto+引用 包含 auto, auto const, auto &, auto&& 等等形式
结构化绑定所声明的变量有两种形式:
1. 非引用变量,此时初始化表达式对象需要拷贝一份,变量所绑定的是初始化表达式对象拷贝的各个子对象。
2. 引用变量,此时初始化表达式对象不需要拷贝,变量所绑定的是初始化表达式对象本身的各个子对象。
结构化绑定中的初始化表达式有三种类型:
1. 数组类型,此时变量所绑定的是数组的各个元素。
2. pair
tuple
等支持 tuple_size
的类型,此时变量所绑定的是 get<0>(e),get<1>(e),get<2>(e)
…
这里E是指类型,e是指对象。
3. 带有 public 成员的结构类型,此时变量所绑定的是结构对象的各个 public 成员。
#include
#include
#include
#include
using namespace std;
struct S {
int a, b;
};
map<string, int> get_map()
{
return {
{ "hello", 1 },
{ "world", 2 },
{ "it's", 3 },
{ "me", 4 },
};
}
int main()
{
auto [a, b] = pair(2, "3"s);
cout << a << b << endl; // 23
set<string> myset;
if (auto [iter, success] = myset.insert("Hello"); success)
cout << *iter << endl; // Hello
int arr[] = {1, 2};
const auto& [m, n] = arr;
cout << m << n << endl; //12
S s = {4, 5};
auto& [x, y] = s;
x = 0, y = 1;
cout << s.a << s.b << endl; // 01
for (auto&& [k, v] : get_map())
cout << "k=" << k << " v=" << v << endl;
// k=hello v=1
// k=it's v=3
// k=me v=4
// k=world v=2
}
#include
#include
#include
#include
using namespace std;
struct S {
int a, b;
};
map<string, int> get_map()
{
return {
{ "hello", 1 },
{ "world", 2 },
{ "it's", 3 },
{ "me", 4 },
};
}
int main()
{
auto kv = make_pair(2, "3"s);
auto& a = kv.first; auto& b = kv.second;
set<string> myset;
set<string>::iterator iter;
bool success;
tie(iter, success) = myset.insert("Hello");
if (success)
cout << *iter << endl; // Hello
int arr[] = {1, 2};
const auto &m = arr[0], &n = arr[1];
cout << m << n << endl; //12
S s = {4, 5};
auto &x = s.a, &y = s.b;
x = 0, y = 1;
cout << s.a << s.b << endl; // 01
for (auto&& kv : get_map()) {
auto&& k = forward<decltype(kv.first)>(kv.first);
auto&& v = forward<decltype(kv.second)>(kv.second);
cout << "k=" << k << " v=" << v << endl;
}
// k=hello v=1
// k=it's v=3
// k=me v=4
// k=world v=2
}