目录
编译器版本:GCC 6.1、LLVM 3.4
__cplusplus:201402L
1 关键字
1.1 auto
扩展auto的使用范围,可用于函数或lambda表达式的形参、返回值
例子:
auto func(auto a, auto b)
{
return a + b;
}
int main()
{
auto foo = [](auto a, auto b, auto c) -> auto
{
return a + b + c;
};
int sum1 = func(10, 29);//在编译器推导出func函数的返回值为int类型
double sum2 = foo(10.1, 20.2, 3.3);//在编译器推导出func函数的返回值为double类型
return 0;
}
1.2 constexpr
扩展constexpr的使用范围,可用于修饰函数,表示该函数属于编译期函数。
除了:
①const、thread_local修饰的变量
②没有初始化的变量声明
③goto语句
以外,constexpr可使用于所有能在编译期计算出结果的函数内
例子:
/*
* 例子:编译期计算等差数列的和
* param[begin]:首项
* param[length]:项数
* param[i]:公差
*/
template<unsigned int begin, unsigned int length, unsigned int i>
constexpr double sum()
{
return length * begin + length * (length - 1) * i / 2.0;
}
int main()
{
double s = sum<10, 20, 1>();
return 0;
}
1.3 decltype
auto推断出的类型为非引用类型,而decltype则是推断表达式的原类型。新增decltype(auto)可代替auto,允许auto声明使用decltype对于给定表达式的推断规则,用法与auto一样。
如:
int && a = 100;//a为int右值引用类型
int &b = a;//b为int引用类型,引用变量a
decltype(b) c = b;//c为int引用类型,引用变量b
auto d = b;//d为int类型,不引用
decltype(auto) e = b;//e为int引用类型,引用变量b
2 语法
2.1 二进制数常量
新增支持直接定义二进制数的功能
语法格式:int num = 0b11100011;//二进制常量需要在前面写上“0b”,然后后面从高位开始写1和0。
2.2 单引号作数字常量分位符
如:
int a = 0b11'0'11'000'0;
unsigned long long b = 34'123'513'31'3'3;
2.3 运行期在栈上创建数组
即在栈上动态创建数组。在草案中提及,但在最终发表的C++版本中被移除。(编译器已支持实现)
如:
int main()
{
int num;
std::cin >> num;
int hehe[num];
return 0;
}
2.4 变量模板
同名字而不同类型的变量,把一个变量当成一个二维坐标(类型,名称)即可理解
如:
template<typename T>
T num;
class MyClass
{
public:
void func() {}
};
int main()
{
num<int> = 0;//int类型的num的值为0,相当于int num;
num<double> = 100.0;//double类型的num的值为100.0,相当于double num;
num<MyClass>.func();//MyClass类型的num的值为MyClass对象,相当于MyClass num;
return 0;
}
2.5 lambda表达式
扩展lambda表达式的捕获列表,可在捕获列表中进行变量的初始化
如:
int main()
{
int a = 10;//设该a为原a
/* 此时tmp引用原a,即在lambda内tmp的值改变会引起原a值的改变
* 而捕获列表中的a是lambda内的a,属于lambda作用域内的局部变量,其值被初始化为原a的值减10
* 捕获列表中tmp和a的类型自动推导为整型
*/
auto func = [&tmp = a, a = a - 10](){
tmp++;
return a + 2;
};
int b = func();//执行后,b的值为2,a的值为11
return 0;
}
3 属性
3.1 deprecated
表示“弃用”,用于修饰函数、变量已被弃用,当编译时会出现“弃用”的提示。
用法例子:
[[deprecated]] void foo()
{ }
[[deprecated]] int count;
int main()
{
foo();//警告,foo已被弃用
int a = count;//警告,count已被弃用
return 0;
}