C++ 的标准发展真快啊!之前刚搞明白了 C++11,现在 C++14 就有来了。其中有几个我比较感兴趣的特性。

1. 泛型 lambda 表达式

C++14 允许使用 auto 关键字来修饰 lambda 表达式

auto lambda = [](auto x, auto y) {return x + y;}

2. 函数返回类型推导

C++14 为所有的函数提供了根据 return 语句的表达式类型推断返回类型。此外,C++14 还拓展了 C++11 原有的规则,使得函数体并不是 return expression; 形式的函数也可以使用返回类型推导。

// Return type to be determined.
auto DeduceReturnType();

如果函数实现中含有多个 return 表达式,这些表达式必须可以推断为相同的类型。使用返回类型推导的函数可以被前向声明,但在定义之前不可以使用。它们的定义在使用它们的翻译单元之中必须是可用的。 这样的函数中可以存在递归,但递归调用必须在函数定义中的至少一个 return 语句之后:

auto Correct(int i)
{
    if (i == 1) {
        // return type deduced as int
        return i;
    }
    else {
        // ok to call it now
        return Correct(i-1)+i;
    }
}

auto Wrong(int i)
{
    if(i != 1) {
        // Too soon to call this.
        // No prior return statement.
        return Wrong(i-1)+i;
    }
    else {
        // return type deduced as int
        return i;
    }
}

这的确是一个不错的功能,但是我个人感觉在实际使用过程中,这种程序员关心上下文的类型自动推导作用有限。

3. 变量模板

C++14中除了函数和类模板之外,还支持了变量模板,看来是要将泛型进行到底了呀!

4. 二进制字面值

C++14 的数字可以用二进制形式指定。其格式使用前缀 0b0B。这样的语法也被 Java、Python、Perl 和 D 语言使用。

5. 运行期确定一维长度的数组

C++11 和之前的标准中,在堆栈上分配的数组被限制为拥有一个固定的、编译期确定的长度。C++14 允许在堆栈上分配的一个数组的最后一维具有运行期确定的长度。 运行期确定长度的数组不可以作为对象的一部分,也不可以具有全局存储期,他们只能被声明为局部变量。运行期确定长度的数组也可以使用 C++11 的基于范围的 for 循环。