C++14 实用的新特性
0、lambda新特性
C++14给lambda表达式添加了两个新功能
- 参数推断(auto)
- 参数初始化后捕获(可以在[]对某个新参数进行赋值)
int a = 30, b = 2; // [] 中赋值了一个参数 // () 中可以使用auto关键字来推断参数类型 // 如果想将赋值参数和原本的捕获方式一起使用,则需要将赋值参数放在[]的最后面 auto func = [=, b, x = 3](auto y) {return x + y; }; cout << func(a) << endl;
初始化捕获的好处是可以支持移动捕获了;不然在C++11中,lambda就只能使用赋值捕获和引用捕获
std::unique_ptr<Item> item(new Item()); // std::move改为右值进行赋值后捕获 auto func = [m = std::move(item)] { /* do something */ };
这个新特性的提出,也让lambda成功有了和bind比拼的能力。在C++11中,bind的优势就是在于移动捕获的支持;
如今lambda也有了这份能力了,我们可以更灵活地根据场景选用lambda或者bind,而不是只能使用bind了。
1、二进制字面量与整形字面量分隔符
(1)新增0b表示其是一个二进制字面量
int a = 0b10'0101'1101;
(2)新增分隔符'用于帮助阅读。
1000000 可以写成 100'0000,提高易读性
const double UNIT_SHUTTERING_SEARCH_MAX_VALUE = 100'0000;
2、std::make_unique
11没有,14新增的,用于创建unique_ptr
std::unique_ptr<std::string> ptr = std::make_unique<std::string>();
3、字符串字面值带引号
C++14允许在字符串字面值中嵌入单引号、双引号和反斜杠等,无需转义。通过使用R"(…)"语法,可以轻松包含原生字符串,而不必担心转义问题。
// rawStr的内容就是:abc\db'\t" const char* rawStr = R"(abc\db'\t")";
4、废弃标志 [[deprecated]]
C++14引入了一个标准化的属性(attribute)来标记已弃用的函数、类或其他声明。
这有助于编译器在编译时发出警告,提醒开发者不应再使用某个已标记为过时的API。
[[deprecated("Use newFunction instead, this function will be removed in version 2.0")]] void oldFunction() { // ... } // 表示oldFunction已经被弃用了,如有必要请使用对应的api替代。
5、constexpr函数的增强
在C++11中,constexpr函数的限制非常严格,要求其函数体仅能包含一个返回语句,且不能包含复杂的控制流语句(如循环、条件分支等)。
// C++11 constexpr阶乘函数的写法,只能使用递归 constexpr int factorial(int n) { return n <= 1 ? 1 : (n * factorial(n - 1)); }
而在C++14中,允许在其函数体内使用更复杂的控制流结构和局部变量声明,也可以有多个返回语句,只要最终的结果能够在编译时计算得出即可。
// C++14 constexpr阶乘函数的写法,可以使用循环 constexpr int factorial(int n) { int ret = 0; for (int i = 0; i < n; ++i) { ret += i; } return ret; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人