C++14 实用的新特性

0、lambda新特性

C++14给lambda表达式添加了两个新功能

  1. 参数推断(auto)
  2. 参数初始化后捕获(可以在[]对某个新参数进行赋值)
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;
}
posted @   小松鼠树懒  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示