- A+
C++14这一继C++11之后的新的C++标准已经被正式批准,正在向ISO提交,将于年内发布。C++之父Bjarne Stroustrup说道,尽管与C++11相比,C++14的改进“有意做的比较小”,但是仍然为用户“带来了极大的方便”,是实现使C++“对新手更为友好”这一目标的步骤之一。
在C++的时间表中,C++14按计划是一个小版本,完成制定C++11标准的剩余工作,目的是使C++成为一门更清晰、更简单和更快速的语言。新的语言特性留到了未来的C++17标准中。
C++14的主要特性可以分为三个领域:Lambda函数、constexpr和类型推导。
Lambda函数
C++14的泛型Lambda使编写如下语句成为可能:
auto lambda = [](auto x, auto y) {return x + y;};
而另一方面,C++11要求Lambda参数使用具体的类型声明,比如:
auto lambda = [](int x, int y) {return x + y;};
此外,新标准中的std::move函数可用于捕获Lambda表达式中的变量,这是通过移动对象而非复制或引用对象实现的:
std::unique_ptr ptr(new int(10)); auto lambda = [value = std::move(ptr)] {return *value;};
constexpr
在C++11中,使用constexpr声明的函数可以在编译时执行,生成一个值,用在需要常量表达式的地方,比如作为初始化模板的整形参数。C++11的constexpr函数只能包含一个表达式,C++14放松了这些限制,支持诸如if 和switch等条件语句,支持循环,其中包括基于区间(range)的for 循环。
类型推导
C++11仅支持Lambda函数的类型推导,C++14对其加以扩展,支持所有函数的返回类型推导:
auto DeducedReturnTypeFunction();
因为C++14是强类型语言,有些限制需要考虑:
- 如果一个函数的实现中有多个返回语句,这些语句一定要推导出同样的类型。
- 返回类型推导可以用在前向声明中,但是在使用它们之前,翻译单元中必须能够得到函数定义。
- 返回类型推导可以用在递归函数中,但是递归调用必须以至少一个返回语句作为先导,以便编译器推导出返回类型。
C++14带来的另一个类型推导方面的改进是decltype(auto)语法,它支持使用与auto同样的机制计算给定表达式的类型。auto和 decltype在C++11中就已经出现了,但是它们在推导类型时使用了不同的机制,这可能会产生不同的结果。
C++14中的其他改变包括可以声明变量模板,支持使用0b或0B前缀来声明二进制字面常量。InfoQ已经介绍过C++14中可能破坏C++11程序的其他小型修改。
主流C++编译器对新语言特性的支持正在有条不紊地开发:Clang“完全实现了当前草案的所有内容”;GCC和Visual Studio也对C++14的新特性提供了一些支持。