C++17 详解 1
本文为 《C++17 in detail》 一书的中文渣中渣译文,不足之处还望指正。
第一部分——语言特性
C++17 是对 C++ 的一次重大更新,引入了大量语言特性。大多数新增特性让 C++ 更简洁更直截了当。
在本部分你将学到:
- 被移除和被标记为已弃用的特性
- C++ 是如何变得更精准的:比如,借助表达式求值顺序保证
- 模版相关新特性:比如
if constexpr、折叠表达式(fold expressions) - 新的标准属性(
attributes) - 如何借助结构化绑定(
structured binding)、内联变量(inline variables)、编译时if和类模版参数推导(template argument deduction for classes)写出更简洁更具表现力的代码
快速开始
为了激发你对新标准更多的好奇心,下面展示几段新特性组合使用的代码示例。
如果觉得示例太复杂也不用担心,因为它们把太多新东西混在了一起。所有新特性都会在接下来的章节进行单独深入解释。
使用 Map
1 | // Example: Part I/demo_map.cpp |
代码输出如下:
1 | John reassigned... |
上边示例使用了如下特性:
- 第 8 行:类模板参数推导——
mapCopy类型从mapUserAge类型推断得来。不需要显式声明为std::map<std::string, int> mapCopy{...}。 - 第 10 行:新的
map插入函数——insert_or_assign。 - 第 10 行:结构化绑定——捕获
insert_or_assign返回的pair到两个分开的变量。 - 第 10 行:带初始化的
if语句——iter、wasAdded只在if语句代码块内可见。 - 第 13 行:基于范围的
for(range-based for)循环内的结构化绑定——可以用key和value代替pair.firstpair.second进行迭代。
调试打印
1 | // Example: Part I/demo_print.cpp |
代码输出如下:
1 | ptr, num: 10 |
这里用到了以下特性:
- 第 5、7、11 行:
if constexpr——用于匹配模版参数,以使编译时丢弃代码。 - 第 5、7、11 行:类型萃取中
_v样式的变量模版——不再需要写明std::trait_name<T>::value。 - 第 20 行:
printWithInfo内的折叠表达式——此特性简化了可变参数模版。本例中我们对所有输入参数分别调用linePrinter()。
正式开始吧!
上边你看到的只是冰山一角,阅读接下来的章节你会看到更多:对当前语言的修复、阐明、移除(比如 auto_ptr),当然还有新增的一些东西:constexpr lambda,if constexpr,结构化绑定,template<auto>,内联变量,类模板参数推断以及更多。
