C++14特性
- 引言
- 特性
-
- lambda表达式参数类型可以使用auto类型
- lambda表达式的捕获列表中允许出现表达式
- 二进制字面量和数字分割符
- deperacated标记过时
- constexpr
- 变量模板
- delctype表达式类型推导(包含引用型)
- make_unique
- std::exchange
- [std::integer_sequence 与 std::index_sequence](#std::integer_sequence 与 std::index_sequence)
引言
本文旨在记录C++14特性。
特性
lambda表达式参数类型可以使用auto类型
使用示例:
bash
auto lambda = [](auto x, auto y) { return x + y; };
int result1 = lambda(1, 2); // 返回 3
double result2 = lambda(1.5, 2.5); // 返回 4.0
lambda表达式的捕获列表中允许出现表达式
使用示例:
bash
int x = 10;
auto lambda = [value = x + 1]() { return value; };
std::cout << lambda(); // 输出 11
二进制字面量和数字分割符
使用示例:
bash
int binary = 0b1010; // 十进制10,书写二进制数值(如 0b1010)比十六进制(0xA)更直观
long million = 1'000'000; // 提高可读性,更清晰,减少人为错误
C++11 及更早版本的标准中,不支持 0b 前缀的二进制字面量。某些编译器(如 GCC、Clang)通过 扩展支持 允许这种写法,但这属于非标准行为,依赖编译器实现。
deperacated标记过时
使用示例:
cpp
[[deprecated("Use new_func() instead")]]
void old_func() {}
可以标记过时的变量,函数和类。在编译的时候输出警告。
个人感觉,仅提示作用。
可进一步查看下面的文章,出自------画个逗号给明天''。
constexpr
在 C++11中constexpr用于修饰函数和常量,必须用常量表达式初始化,只能包含一个return语句,被constexpr修饰的函数内部不能有局部变量定义,不能有分支语句,循环语句等,参数和返回值必须是字面量类型。
而C++14进一步放宽限制,允许在constexpr修饰的函数中有局部变量,条件变量和分支语句。
使用示例:
cpp
constexpr int factorial(int n) {
int result = 1;
for (int i = 1; i <= n; ++i) {
result *= i;
}
return result;
}
static_assert(factorial(5) == 120, "");
变量模板
允许定义模板化的常量变量。
使用示例:
cpp
template<typename T>
constexpr T pi = T(3.1415926535897932385);
double circle_area(double r) {
return pi<double> * r * r;
}
delctype表达式类型推导(包含引用型)
使用示例:
cpp
int x = 42;
int& r = x;
decltype(auto) y = x; // int
decltype(auto) z = r; // int&
make_unique
之前C++11只有make_shared.
使用示例:
cpp
auto p = std::make_unique<int>(42);
auto arr = std::make_unique<int[]>(10); // 数组版本
std::exchange
新值替换旧值,返回原值。
cpp
int a = 10;
int old = std::exchange(a, 20); // old = 10, a = 20
std::integer_sequence 与 std::index_sequence
cpp
template<typename Tuple, size_t... I>
void print_impl(const Tuple& t, std::index_sequence<I...>) {
((std::cout << std::get<I>(t) << " "), ...);
}
template<typename... Args>
void print(const std::tuple<Args...>& t) {
print_impl(t, std::index_sequence_for<Args...>{});
}
以上是C++14相对于C++11新增的部分特性。