c++14新特性

C++14

c++14相比于c++11增加了很多新的特性,我在这里举几个我认为比较有用的讲解一下

返回值类型推导

在c++11中已经可以使用返回值类型推导,但是要在后面加上->decltype(x)()

auto factorial(int n) ->decltype(n){
    return n;
}

但是在c++14之后对函数返回推导规则做了优化,可以直接用auto做返回值,而省略掉后面的->decltype(n)

注意:

  1. 函数中如果有多个返回语句,它们必须返回相同的类型,否则编译失败
  2. 如果return初始化列表,返回值类型推导也会失败
  3. 如果函数是虚函数,不能使用返回值类型推导
  4. 返回值类型推导在使用它们之前,编译单元必须能够找到函数定义
  5. 如果使用在递归中,必须以至少一个返回语句作为先导,以便编译器推导出返回类型

lambda中的auto

在c++11中lambda表达式参数需要使用具体的类型声明:

auto f = [] (int a) { return a; }

c++14中lambda中的参数可以直接是auto

auto f = [] (auto a) { return a; }

constexpr的限制

在c++11中对于constexpr修饰的常量函数要求是比较苛刻的:

  • 整个函数的函数体中,除了可以包含using指令,typedef语句以及static_assert断言以外,只能有一条return返回语句

这个要求使得常量表达式函数只能执行一些简单的函数,而在c++14中,对于常量函数的限制就减少了很多

  1. constexpr函数在c++14中可以使用局部变量和循环
constexpr int factorial(int n) { 
    int ret = 0;
    for (int i = 0; i < n; ++i) {
        ret += i;
    }
    return ret;
}
  1. constexpr函数在c++14中不需要把所有的东西都放在一个单独的return语句当中
constexpr int func(bool flag) {
    if (flag) return 1;
    else return 0;
}

make_unique

c++14中添加了unique_ptr中缺少的make_unique

struct A {};
std::unique_ptr<A> ptr = std::make_unique<A>();

std::exchange

int main() {
    std::vector<int> v;
    std::exchange(v, {1,2,3,4});
    cout << v.size() << endl;
    for (int a : v) {
        cout << a << " ";
    }
    return 0;
}

这乍一看就是swap函数吗,他有什么不同吗

template<class T, class U = T>
constexpr // Since C++20
T exchange(T& obj, U&& new_value)
    noexcept( // Since C++23
        std::is_nothrow_move_constructible<T>::value &&
        std::is_nothrow_assignable<T&, U>::value
    )
{
    T old_value = std::move(obj);
    obj = std::forward<U>(new_value);
    return old_value;
}

这是官方的实现,可以看到它是使用完美转发,将new_value的值赋值为obj,并将原来的obj的值返回

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值