据 Herb Sutter的博客所写,在美国夏威夷Kona 举行的冬季会议上,ISO C++ 标准委员会最终完成了C++17 标准的制定工作。下面对C++17 的主要特性做简要概括。
Kona 会议的主要议程是解决来自一些国家机构的审查意见,并修复一些软件故障,因此并未给出过多的新特性。特别需要指出的是,在 Knoa 会议上添加了一个新的 std::byte
类型,精简了程序对“位导向”(byte-oriented)内存访问的处理方式。目前的实现是依赖于 char(无论 signed char 还是 unsigned char)类型的,鉴于 char 类型还承担了字符类型和算术运算类型的职责,这种实现尚存在着不合理之处。另一方面,std::byte
将会被分离出来作为一个专用类型。
其它 C++17 主要新特性包括:
- 可在 constexprs 中使用 Lambda 表达式,去除了预先存在的限制。使用 constexprs 定义的对象或函数可在编译等阶段就进行求值,因此可以实现一些高级的模板参数或数组大小说明符。编译器会确保 constexprs 对象或函数按设定的需求编译,实现所描述的使用。
- 允许在Lambda 表达式中,以值的形式得到
*this
,这对并行代码或使用std::future
的场景具有很大的影响,因为 Lambda 表达式在执行时无法保证 this 的有效性。 - 增加了
std::optional
,可使用 optinal 类型表示某个已定义或尚未定义的值。如果用 C++ 的措辞解释,可以说 optional 是一种管理对象初始化状态的封装器。 - 增加了
std::variant
,可使用联合体类型定义类似于“浮点型或长整型的联合体”。 - 可推断类模板参数的构造函数,这样代码编写可简化为:
auto lock = std::lock_guard(mut_, r1);
而非:
std::lock_guard<:shared_timed_mutex std::shared_lock=""><:shared_timed_mutex>> lck(mut_, r1);</:shared_timed_mutex></:shared_timed_mutex>
- 可推断模板的无类型参数,例如:
template <auto v=""> struct S; // 可推断出 v 的类型。</auto>
C++17 新特性的列表非常长,这里无法一一列举。推荐 Stack Overflow 网站上的一篇问题解答,其中对C++17 新特性做了一个简洁的归纳,更新至最近的Kona 会议内容,并提供了指向官方委员会文档的链接。
查看英文原文: C++17 Is Ready
感谢张卫滨对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论 1 条评论