C++ 之父 Bjarne Stroustrup 说道,尽管与 C++11 相比,C++14 的改进“有意做的比较小”,但是仍然为用户“带来了极大的方便”,是实现使C++“对新手更为友好”这一目标的步骤之一。
语言特性
泛型的 Lambda 函数
在 C++11 中,lambda 函数的形式参数需要被声明为具体的类型。C++14 放宽了这一要求,允许lambda 函数的形式参数声明中使用类型说明符 auto。
auto lambda = [](auto x, auto y) {
return x + y;}
泛型 lambda 函数遵循模板参数推导的规则。以上代码的作用与下面的代码相同:
struct unnamed_lambda
{
template<typename T, typename U>
auto operator()(T x, U y) const {
return x + y;}
};
auto lambda = unnamed_lambda();
函数返回类型推导
C++11 允许 lambda 函数根据 return 语句的表达式类型推断返回类型。C++14 为一般的函数也提供了这个能力。C++14 还拓展了原有的规则,使得函数体并不是{return expression;}形式的函数也可以使用返回类型推导。
为了启用返回类型推导,函数声明必须将 auto 作为返回类型,但没有 C++11 的后置返回类型说明符:
auto DeduceReturnType(); //返回类型由编译器推断
数值相关
二进制字面值
C++14的数字可以用二进制形式指定。其格式使用前缀0b或0B
。这样的语法也被 Java、Python、Perl 和 D 语言使用。
标准库自定义字面值
C++11增加了自定义字面量(user-defined literals)的特性,使用户能够定义新的字面量后缀,但标准库并没有对这一特性加以利用。C++14 标准库定义了以下字面量后缀:
“s”,用于创建各种 std::basic_string 类型。
“h”、“min”、“s”、“ms”、“us”、“ns”,用于创建相应的 std::chrono::duration 时间间隔。
using namespace std::literals;
std::string str = "hello world"s;
std::chrono::seconds dur = 60s;
两个"s"互不干扰,因为表示字符串的只能对字符串字面量操作,而表示秒的只针对数字。
数字分位符
C++14引入单引号'
作为数字分位符号,使得数值型的字面量可以具有更好的可读性。Ada、D 语言、Java、Perl、Ruby等程序设计语言使用下划线_
作为数字分位符号,C++之所以不和它们保持一致,是因为下划线已被用在用户自定义的字面量的语法中。
auto integer_literal = 100'0000;
auto floating_point_literal = 1.797'693'134'862'315'7E+308;
auto binary_literal = 0b0100'1100'0110;
auto silly_example = 1'0'0'000'00;
标准库特性
通过类型寻址元组
C++11引入的 std::tuple 类型允许不同类型的值的聚合体用编译期整型常数索引。C++14还允许使用类型代替常数索引,从多元组中获取对象。若多元组含有多于一个这个类型的对象,将会产生一个编译错误:
tuple<string, string, int> t("foo", "bar", 7);
int i = get<int>(t); // i == 7
int j = get<2>(t); // Same as before: j == 7
string s = get<string>(t); //Compiler error due to ambiguity
std::make_unique
std::make_unique可以像std::make_shared 一样使用,用于产生 std::unique_ptr 对象。
std::cbegin()/std::cend()
全局std::begin/std::end函数之外,增加了std::cbegin/std::cend函数,它们总是返回常量迭代器(constant iterators)。