C++17特性之结构化绑定
Preface
偶尔想写一点自己感兴趣的C++语法内容,今天终于得以付诸实施,就从结构化绑定(Structured Binding)开始吧。
Grammar
结构化绑定的语法很简单,大致有如下三种形式:
attr cv-auto ref-qualifier [identifier-list] = expression; // 1 |
其中属性attr
和引用运算符ref-qualifier
(&
或者&&
)都是可选的,可以不出现;cv-auto
是可以带const
或volitile
的auto
类型声明,此类型声明也可以是static
或者thread_local
;identifier-list
是expression
要绑定到的变量名列表,如果前者中的某个成员出现在后者中则视为错误。
如果类型声明为auto
,则expression
的值会一一按顺序复制到identifier-list
的各个成员中;如果是auto &
或者auto &&
,则expression
中的各个子对象会直接绑定到identifier-list
中各个变量上,即引用。
所以有人在C++17发布后讲到,现在的C++越来越像Python了。恐怕这个新语法对这种想法也有不小的贡献。
Examples
首先是绑定数组成员到变量:
int arr = {0, 1, 2}; |
这个应该比较好理解,a, b, c
是复制了数组中的元素,而ar, br, cr
是指向数组各元素的引用,如果可以打印各变量的指针,那么应该可以很容易就验证这个结论。
绑定结构成员到变量:
1 | std::unordered_map<std::string, int> get_map() |
这里的结构成员不单指struct
或者class
声明的自定义类型,也包括std::set
,std::unordered_map
等这些容器,可以把它们看做成员匿名的结构体或者类。
在需要遍历数个同类型变量,且这些变量时相互独立的,也可以使用结构化绑定以简化代码。
|
此处在for循环中声明了一个局部的tuple,并遍历它。
Reference
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Stephen Zhang's Blog!
评论