面试之C++14

在这里插入图片描述

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)。

猜你喜欢

转载自blog.csdn.net/xp178171640/article/details/118091522