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", '\'', '\\');