c++14 特性

C++14标准是 ISO/IEC 14882:2014 Information technology – Programming languages – C++ 的简称。在标准正式通过之前,原名C++1y。 C++14标准的委员会草案N3690于2013年5月15日发表。 2014年8月18日,经过C++标准委员投票,C++14标准获得一致通过。草案文档经过一定的文字润色和修正之后,将在年内提交给ISO作为正式的C++标准发布。

官方链接 https://en.cppreference.com/w/cpp/14

c++14 特性

1. 变量模板

template<class T>
constexpr T pi = T(3.1415926535897932385L); 

int main() {
    std::cout << pi<double> << std::endl;
    std::cout << pi<float> << std::endl;
    std::cout << pi<int> << std::endl;
    return 0;
}

2. lambda函数改进

// lambda 参数允许使用auto
auto lambda = [](auto x, auto y) {return x+y;};
// 表达式捕获
auto lambda = [value{1}] {return value;};

auto lambda = [a=1](auto b) {return a+b;};

// move, 代替部分bind 功能
std::unique_ptr<Obj> obj = std::make_unique<Obj>();
auto func = [o = std::move(obj)] { /* do something */ };

3. constexpr 限制

// c++14可以有多个return, 局部变量,循环等, c++11不允许
constexpr int fact(int n) {
    if (n <= 0) {
        return 0;
    }
    int t = 1;
    for (int i = 1; i < n; ++i) {
        t *= i;
    }
    return t;
}

4. 二进制字面量

int b1 = 0b1001;
int b2 = 0b1000;

5. 数字分隔符

// 仅增强可读性
std::cout << 1'000'000 << std::endl;

6. 返回值推导

// 根据返回值类型推导
// 限制: 
// 1. 多个return 推导结果必须一致
// 2. 没有return 推导为void
// 3. 递归返回推导必须有一个已经推导完成的return
// 4. 不能推导初始化列表
// 5. 虚函数不能使用返回值推导
template<typename T, typename U>
auto add(T x, U y) {
    return x + y;
}

int main() {
    std::cout << add(1,2) << std::endl;
    std::cout << add(1,2.0) << std::endl;
    std::cout << add(std::string("1"), "23") << std::endl;
}

7. [[deprecated]] 标记

// 使用会有一个编译器warning
[[deprecated]]
void f() {
  // deprecated
  return;
}

8. std::make_unique

std::unique_ptr<T> t = std::make_unique<T>();

9. 读写锁 std::shared_timed_mutex与std::shared_lock

std::shared_timed_mutex mutex; //带超时时间
std::shared_lock; // RAII shared_timed_mutex

10. std::exchange

// s1 = s2;
std::string s1="hello", s2="world";
std::exchange(s1, s2); // world world
std::cout << s1 << " " << s2 << std::endl;

std::exchange(s1, "hello"); // hello
std::cout << s1 << std::endl;

std::exchange(s1, std::move(s2)); // world ""
std::cout << s1 << " " << s2 << std::endl;

11. std::quoted

// 转义用
std::cout << std::quoted("i'm a good boy", '\'', '\\');