C++14新特性个人总结

 

目录

1 关键字

1.1 auto

1.2 constexpr

1.3 decltype

2 语法

2.1 二进制数常量

2.2 单引号作数字常量分位符

2.3 运行期在栈上创建数组

2.4 变量模板

2.5 lambda表达式

3 属性

3.1 deprecated


编译器版本: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值