【原文】https://zh.wikipedia.org/wiki/C++17
简介
C++17(或非正式名称,C++1z)是ISO/IEC 14882标准的最新版本的C++编程语言的名称。C++17标准在2017年3月达到国际标准草案(DIS)阶段。这一DIS得到了一致的认可,只有编辑者的评论,最终标准在2017年12月出版。
新特性
C++17引入了许多新的特性。以下列表可能不完整。
语言
- 使
static_assert
的文本消息可选 - 去除三字符词
- 在模板的模板参数中允许
typename
(作为class
的替代品) - 大括号初始化列表中
auto
推断的新规则 - 嵌套命名空间定义,例如,用
namespace X::Y { … }
代替namespace X { namespace Y { … }}
- 允许命名空间和枚举器的属性
- 新的标准属性
[[fallthrough]]
、[[maybe_unused]]
和[[nodiscard]]
- UTF-8(
u8
)字符字面值(UTF-16和UTF-32字符串字面值自从C++11开始存在) - 十六进制浮点字面值
- 针对所有非类型模板参数的常量评估
- 针对变长模板的折叠表达式
- 编译时的静态
if
,格式为if constexpr(expression)
- 结构化绑定声明,允许
auto [a, b] = getTwoReturnValues();
if
和switch
语句的初始化器- 类型
T
的对象的从类型T
的纯右值表达式进行复制初始化和直接初始化不应调用纯右值表达式的复制或移动构造函数 - 超过对齐的内存分配扩展
- 构造函数的模板推导,允许用
std::pair(5.0, false)
代替std::pair<double,bool>(5.0, false)
- 内联变量,允许在头文件中定义变量
__has_include
,允许由预处理指令检查头文件的可用性__cplusplus
的值改为201703L
库
- 大部分库基础TS1,包括:
std::string_view
,对字符序列或字符串切片的只读非占有引用std::optional
,用于表示可选对象std::any
,用于保存任何类型的单个值
std::uncaught_exceptions
,作为std::uncaught_exception
的替代- 针对
std::map
和std::unordered_map
的新增插入函数try_emplace
和insert_or_assign
- 统一容器访问:
std::size
、std::empty
和std::data
- “连续迭代器”的定义
- 过时的类型和函数的移除,包括
std::auto_ptr
、std::random_shuffle
和旧的函数适配器 - 基于
boost::filesystem
的文件系统库 - STL算法的并行版本
- 附加数学特殊函数,包括椭圆积分和贝塞尔函数
std::variant
,带有标记的联合容器std::byte
- 逻辑运算符特性:
std::conjunction
、std::disjunction
和std::negation