C++14 新特性

auto - 函数返回值类型推导

  • 对于多个返回类型,要求返回类型一致
  • 不能返回初始化列表
  • 不能用于虚函数
  • 可以用于函数声明,但是在使用前一定要对进行定义
#include <iostream>

using namespace std;

//返回值自动类型推导,c++11里是无法编译通过的
auto func(int i) {
    return i;
}

int main() {
    cout << func(4) << endl;
    return 0;
}

auto - lambda参数auto

//在C++14中,lambda表达式参数可以直接是auto
auto f = [] (auto a) { return a; };
cout << f(1) << endl;
cout << f(2.3f) << endl;

变量模板

//返回圆周率

//c++11的方法
//在C++14之前,这样的常量只能被定义为函数模板。
template<class T>
constexpr T pi_fn()
{
    return T(3.1415926535897932385);
}

//c++14 变量模板
//在C++14之后,我们可以用变量模板直接定义这样的常量。
template<class T>
constexpr T pi = T(3.1415926535897932385);

int main()
{
   cout << pi_fn<int>() << pi<int> << '\n'; // 33
   cout << setprecision(10) << pi<float> << '\n'; // 3.141592741
   cout << setprecision(10) << pi<double> << '\n'; // 3.141592654
}

别名模板 - 让using起别名支持模板

template<typename T, typename U>
struct A;

template<typename T>
struct B
{
    typedef A<T, int> type;
};

template<typename T>
using C = A<T, int>;

template<typename T>
using D = typename B<T>::type;

constexpr的限制

[[deprecated]]标记

  • C++14中增加了deprecated标记,修饰类、变、函数等,当程序中使用到了被其修饰的代码时,编译时被产生警告,用户提示开发者该标记修饰的内容将来可能会被丢弃,尽量不要使用。
struct [[deprecated]] A { };

int main() {
    A a;
    return 0;
}

二进制字面量 & 整形字面量分隔符

int a = 0b0001'0011'1010;
double b = 3.14'1592'5358;

make_unique

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

std::shared_timed_mutex与std::shared_lock

std::integer_sequence

std::exchange

  • 与swap类似,但是性能更好
template<class T, class U = T>
constexpr T exchange(T& obj, U&& new_value) {
    T old_value = std::move(obj);
    obj = std::forward<U>(new_value);
    return old_value;
}

std::quoted

  • 给字符串加引号
int main() {
    string str = "hello world";
    cout << str << endl;
    cout << std::quoted(str) << endl;
    return 0;
}