C++14
c++14相比于c++11增加了很多新的特性,我在这里举几个我认为比较有用的讲解一下
返回值类型推导
在c++11中已经可以使用返回值类型推导,但是要在后面加上->decltype(x)()
auto factorial(int n) ->decltype(n){
return n;
}
但是在c++14之后对函数返回推导规则做了优化,可以直接用auto做返回值,而省略掉后面的->decltype(n)
注意:
- 函数中如果有多个返回语句,它们必须返回相同的类型,否则编译失败
- 如果return初始化列表,返回值类型推导也会失败
- 如果函数是虚函数,不能使用返回值类型推导
- 返回值类型推导在使用它们之前,编译单元必须能够找到函数定义
- 如果使用在递归中,必须以至少一个返回语句作为先导,以便编译器推导出返回类型
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中,对于常量函数的限制就减少了很多
- constexpr函数在c++14中可以使用局部变量和循环
constexpr int factorial(int n) {
int ret = 0;
for (int i = 0; i < n; ++i) {
ret += i;
}
return ret;
}
- 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的值返回