C++14更多新特性

Share on:
400 Words | Read in about 2 Min | View times

Overview

C++14其实新增的特性不算太多,都是一些对C++11的一些优化和补充。大部分的新特性在前几篇文章《C++auto关键字改进》《C++14模板的改进》《C++读写锁》《C++14 exchange》中都有介绍,剩下的新特性在这篇文章中集中介绍。

本系列文章将包括以下领域:

本章其他内容请见 《现代C++》

constexpr的改进

C++11中constexpr关键字修饰函数时,所有逻辑必须在一个return语句中完成,比如:

1//C++11
2constexpr int factorial(int n) {
3    return n <= 1 ? 1 : (n * factorial(n - 1));
4}

而在C++14中,constexpr关键字修饰函数不再要求所有逻辑必须在一个return语句中完成,可以使用局部变量和循环等:

1//C++11不支持,C++14支持
2constexpr int factorial(int n) {
3    int result = 0;
4    for (int i = 0; i < n; ++i) {
5        result += i;
6    }
7    return result;
8}

[[deprecated]标记

C++14中新增了deprecated标记,用来修饰类、结构体、变量、函数等。当程序中使用到了被其修饰的代码时,编译时会产生警告,提示开发者该标记修饰的内容将来可能会被丢弃,尽量不要使用:

1#include <iostream>
2
3void [[deprecated]] f() { std::cout << "f()" << std::endl; }
4
5int main() {
6    f();
7}

编译结果会产生警告:

1main.cpp:3:6: warning: attribute ignored [-Wattributes]
2    3 | void [[deprecated]] f() { std::cout << "f()" << std::endl; }

二进制字面量和整型字面量分隔符

C++14引入了二进制字面量和整型字面量的分隔符,可以提高代码可读性:

1int a = 0b0001'1001'0001;
2double b = 3.141'5926'5358'9793'2385;

std::make_unique

在智能指针构建方面,C++11提供了std::make_shared,却没有提供std::make_unique。C++14就把这个遗漏补上了:

1struct A { };
2auto ptr = std::make_unique<A>();

std::integer_sequence

C++14提供了类模板std::integer_sequence,定义为标准库头文件<utility>中,声明原型为:

1template< class T, T... Ints >
2struct integer_sequence;

用来表示一个编译时的整数序列。用作函数模板的实参时,能推导参数包Ints并将其用于包展开。

C++14还提供了几个别名模板作为辅助函数:

  • std::index_sequence
1template<std::size_t... Ints>
2using index_sequence = std::integer_sequence<std::size_t, Ints...>;
  • std::make_integer_sequence
1template<class T, T N>
2using make_integer_sequence = std::integer_sequence<T, /* a sequence 0, 1, 2, ..., N-1 */ >;
  • std::make_index_sequence
1template<std::size_t N>
2using make_index_sequence = std::make_integer_sequence<std::size_t, N>;
  • std::index_sequence_for
1template<class... T>
2using index_sequence_for = std::make_index_sequence<sizeof...(T)>;
 1#include <iostream>
 2#include <utility>
 3
 4template<typename T, T... ints>
 5void print(std::integer_sequence<T, ints...> seq)
 6{
 7    std::cout << "sequence size is " << seq.size() << ": ";
 8    ((std::cout << ints << ' '),...); //C++17折叠表达式
 9    std::cout << std::endl;
10}
11
12int main() {
13    print(std::integer_sequence<int, 0, 1, 2, 3, 4>{}); //sequence size is 5: 0 1 2 3 4
14    print(std::make_integer_sequence<int, 5>{}); //sequence size is 5: 0 1 2 3 4
15    print(std::make_index_sequence<5>{}); //sequence size is 5: 0 1 2 3 4
16    print(std::index_sequence_for<float, char, double, int, long>{}); //sequence size is 5: 0 1 2 3 4
17    return 0;
18}

std::quoted

C++14引入std::quoted用于给字符串添加双引号:

1int main() {
2    string foo = "hello world";
3    std::cout << foo << std::endl; //hello world
4    std::cout << std::quoted(foo) << std::endl; //"hello world"
5    return 0;
6}
Prev Post: 『C++14 exchange』
Next Post: 『C++17类模板参数推导』