C++14新特性总结

C++14是对C++11标准的一个较小但重要的补充和改进,它在保持向后兼容性的同时,引入了一系列旨在提高代码简洁性和效率的新特性和增强功能。以下是一些C++14的关键新特性:

1. Lambda初始化捕获:
在C++14中,lambda表达式的捕获列表支持直接初始化捕获的变量,这意味着可以在定义lambda时直接为捕获的变量赋予初始值,而无需在外部提前声明。例如:auto func = [y = 2]() { return y * 2; };在这里,y是在lambda内部捕获并初始化为2的局部变量。

2. 泛型lambda参数
参数使用auto关键字进行自动推断,使lambda更加灵活和通用。例如:

auto print = [](const auto& value) { std::cout << value << '\n'; };
print(10); // Works for integers
print("Hello"); // Works for strings too

3. 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;
}

3. 废弃标志 [[deprecated]]:
C++14引入了一个标准化的属性(attribute)来标记已弃用的函数、类或其他声明。这有助于编译器在编译时发出警告,提醒开发者不应再使用某个已标记为过时的API。例如:[[deprecated("Use newFunction instead, this function will be removed in version 2.0")]]void oldFunction() {// ...},表示oldFunction已经被弃用了,如有必要请使用对应的api替代。

4. 读写锁std::shared_timed_mutex和std::shared_lock:
C++14扩展了线程支持库,引入了std::shared_timed_mutex作为新的互斥量类型,它支持共享(读)锁定和独占(写)锁定。同时,新增了std::shared_lock类模板,作为一个便捷的共享锁管理器,提供了对std::shared_timed_mutex以及其他兼容锁类型的隐式锁定和解锁操作。

5. 模板可变整数序列:
C++14增强了模板元编程的能力,引入了可变参数模板的整数序列表示。这使得在编译时处理整数序列变得更加容易,对于实现各种编译时计算、算法或数据结构非常有用。虽然具体细节未在提供的信息中给出,但这类特性通常涉及到使用类似std::integer_sequence和std::make_integer_sequence等工具类。

6. std::exchange:
std::exchange用于原子地交换一个对象的值,并返回其旧值。这个函数在处理资源管理、状态转换等场景时特别有用。

std::string str = "hello!";
// ret的值为:hello
// str的值为:hello world!
auto ret = std::exchange(str, "hello world!");

7. 字符串字面值带引号:
C++14允许在字符串字面值中嵌入单引号、双引号和反斜杠等,无需转义。通过使用R"(…)"语法,可以轻松包含原生字符串,而不必担心转义问题。

// rawStr的内容就是:abc\db'\t"
const char* rawStr = R"(abc\db'\t")";

8. 二进制字面量与整形字面量分隔符
新增0b表示其是一个二进制字面量,新增分隔符'用于帮助阅读。

int a = 0b10'0101'1101;
int b = 9'1234'5678;

9. std::make_unique
新增了std::make_unique用于创建std::unique_ptr对象。

std::unique_ptr<std::string> ptr = std::make_unique<std::string>();

10. 变量模板

template<class T>
constexpr T pi = static_cast<T>(3.1415926);

auto a = pi<int>;
auto b = pi<float>;
  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值