据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是一种管理对象初始化状态的封装器。 - \ \ \\
- \
可推断类模板参数的构造函数,这样代码编写可简化为:
\ \
auto lock = std::lock_guard(mut_, r1);\\
而非:
\\std::lock_guard<:shared_timed_mutex std::shared_lock=\"\"><:shared_timed_mutex>\u0026gt; lck(mut_, r1);\\
- 可推断模板的无类型参数,例如: \
template struct S; //可推断出v的类型。\\
C++17新特性的列表非常长,这里无法一一列举。推荐Stack Overflow网站上的一篇问题解答,其中对C++17新特性做了一个简洁的归纳,更新至最近的Kona会议内容,并提供了指向官方委员会文档的链接。
\\查看英文原文: C++17 Is Ready
\\感谢张卫滨对本文的审校。
\给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们。