组块分隔符
C++14新增了用单引号表示的组块分隔符。
使用这种语法,可以提高代码的可读性。
1 2 3 4 |
int moneyInBank = -10'000;//-10000 long populationChange = -85'000;//-85000 long long countryGDPChange = -70'000'000'000;//-70000000000 double pi = 3.141'592'653'59;//3.14159265359 |
二进制字面量
从C++14起,我们可以使用二进制字面量
1 |
int shortNumber = 0b1010;//二进制1010转换成10进制 |
auto用于推断函数
auto可以被使用来让编译器根据赋值给变量的初始值来推断变量的类型
从C++14起,auto也适用于函数。具体:使用auto让编译器根据函数返回的值来推断函数的返回类型。
1 2 3 4 5 6 7 8 9 |
const double pi = 3.141'592'653; auto Area(double radius) { return pi * radius * radius; } list<char> charsInList {'a','h','z','k','l'}; for_each(charsInList.cbegin(),charsInList.cend(),[](auto & element) {cout << element << ' ';}); |
参数数量可变的模板
参数可变的模板是C++14添加的功能。
可用于执行数学计算,也可用于完成某些简单的任务。
通过使用参数数量可变的模板,程序员可避免反复实现执行任务的各种重载版本,从而创建出更简短、更容易维护的代码。
具体用法是:在模板中使用省略号...来告诉编译器,默认类或模板函数可接受任意数量的模板参数,且这些参数可为任意类型。
1 2 3 4 5 6 7 8 |
template<typename Res,typename First,typename...Rest> void Sum(Res & result,First vall,Rest...valN) { result = result + vall; return Sum(result,valN...); } int arrNums[sizeof...(Rest)]; |
operator""s
从C++14起,标准库支持将用引号括起来的字符串转换为std::basic_string<t>的operator""s.
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> using namespace std; int main() { string str1("traditional string \0 initialization"); cout << "str1" << str1 << "length:" << str1.length() << endl;//19 string str2("C++ 14 \0 initialization using literals"s); cout << "str2" << str2 << "length:" << str2.length() << endl;//37 return 0; } |
解析:
str1中,由于字符串中间的空字符导致str1根本不包含单词initialization。
C++14的语法,能够让str2包含并操作含有空字符串的字符缓冲区。
1 2 |
std::chrono::seconds timeInSec(100s);//100 seconds std::string timeinText = "100"s;//string "100" |
泛型lambda表达式
C++14的泛型lambda表达式
将auto用于lambda参数的定义中。使用auto类型声明定义lambda参数和创建模板函数基本相当。
lambda会基于参数推导类型来进行特定的实例化
这一点,对于在不同上下文中重用的lambdas来说,是非常方便的一点。
1 |
auto lambda = [](auto lhs,auto rhs) {return lhs+rhs;}; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <vector> #include <string> #include <numeric> using namespace std; int main() { vector<int> _Vec_int = {1,2,3,4}; vector<string> _Vec_string = {"red","blue","yellow"}; //----------- auto adder = [](auto lhs,auto rhs){return lhs+rhs}; //----------- cout << accumulate(_Vec_int.begin(),_Vec_int.end(),0,adder);//10 cout << accumulate(_Vec_string.begin(),_Vec_string.end(),string(""),adder);//redgreenblue return 0; } |
constexpr
在C++11标准下,使用constexpr声明的函数可以在编译时执行,生成一个值,用在需要常量表达式的地方,比如作为初始化模板的整形参数。
C++11的constexpr函数只能包含一个表达式,C++14放宽了这些限制,支持诸如if、switch等条件语句,支持循环(包括范围for循环)。
使用STL位标志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <bitset> using namespace std; bitset<4> fourBits; cout << fourBits << endl;//0000 bitset<5> fiveBits("10101"); cout << fiveBits << endl;//10101 bitset<6> sixBits(0b100001);//C++14二进制字面量 cout << sixBits << endl;//100001 bitset<8> eightBits(255); cout << eightBits << endl;//11111111 |
在lambda表达式捕获列表中使用std::move()
C++14支持在捕获列表中使用std::move()
1 2 3 4 |
std::unique_ptr<char> alphabet(new char); *alphabet = 's'; auto lambda = [capture = std::move(alphabet)](){std::cout << *capture << endl;}; |
在构造函数中使用类型自动推断功能
C++14支持自动推断构造函数的模板参数类型
1 |
std::pair<int,double> pairIntToDb(3,3.14159265359); |
可以初始化的lambda捕获列表
在C++14标准中,我们不仅可以声明一个捕获变量,也可以对它初始化。
1 |
auto y = [&r=x,x = x+1]()->int {/*do something*/}; |
解析:
创建了x的引用r,对r的修改将影响到外面的x的值。同时在这个lambda函数域可见范围内新建了一个变量x,并且以外面的x增加1为初始值进行初始化。
[[deprecated]]属性
将[[deprecated]]标签放在声明前面
这些声明可以是一个类、变量、函数或其他东西。
1 |
[[deprecated]] flat() {}; |
当我们的程序使用了一个deprecated的实体,原本需要编译器做出反应,现在留给了代码实现者。
就是我们会收到某种警告,提示我们是否真的需要这么做。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Objective-C 解析plist04/28
- ♥ Json库RapidJson使用01/11
- ♥ C++标准模板库编程实战_关联容器12/07
- ♥ Effective C++_第三篇07/01
- ♥ COM组件_207/22
- ♥ C++并发编程 _ 同步并发(Future)05/22