C++14 新特性
Created At :
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
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;
}