C++14更多新特性
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}