1.概要
2.内容
C++11是C++标准的一个重要更新,引入了许多新特性和语言改进。以下是C++11的一些主要新特性:
- 自动类型推导(auto):
- C++11中新增了
auto
关键字,它可以自动推导变量的类型,从而简化代码。编译器会根据初始化表达式自动推断变量的类型。
- C++11中新增了
- 统一的列表初始化:
- 使用大括号
{}
可以进行统一的列表初始化,这适用于各种STL容器和自定义类型。
- 使用大括号
- 类型推导关键字decltype:
- 除了
auto
,C++11还引入了decltype
关键字,用于在编译时推导表达式的类型。
- 除了
- nullptr关键字:
- 替代了C++03中的
NULL
宏,nullptr
是C++11中的一个新的字面量,用于表示空指针常量。
- 替代了C++03中的
- 范围for循环(range-based for loop):
- 简化了对容器(如vector、array等)的遍历。
- 右值引用和移动语义:
- 右值引用(
&&
)和移动语义允许在资源管理上更加高效,如移动构造函数和移动赋值操作符。
- 右值引用(
- Lambda表达式:
- 允许定义匿名函数对象,常用于回调函数和算法中。
- 关键字default和delete:
- 允许明确指定类或结构体的成员函数(如构造函数、析构函数、拷贝构造函数、赋值操作符等)的默认实现或删除它们。
- 可变参数模板(variadic templates):
- 允许定义接受任意数量和类型参数的函数模板和类模板。
- 线程库:
- C++11引入了线程库,包括线程管理、互斥锁、条件变量等,用于支持多线程编程。
- 包装器(std::function):
- 是一种通用的、多态的函数包装器,可以将任何可调用目标(如函数、lambda表达式、函数对象等)封装为
std::function
对象,并可以存储、复制和调用它们。
- 是一种通用的、多态的函数包装器,可以将任何可调用目标(如函数、lambda表达式、函数对象等)封装为
- 原子操作:
- 提供了一组原子操作函数和宏,用于多线程环境中的无锁编程。
- emplace_back:
- 是某些容器(如std::vector)的新成员函数,它允许在容器内部直接构造元素,避免了不必要的拷贝或移动操作。
这些新特性大大提高了C++语言的易用性、安全性和性能,使得C++在现代软件开发中更加具有竞争力。
3.关联知识
1.包装器(std::function)
std::function
是 C++11 引入的一个标准库模板类,用于封装任何可以调用的目标(callable target)。它提供了一种通用的、类型安全的方式来存储和调用函数、lambda 表达式、绑定表达式或其他函数对象,以及指向成员函数的指针和指向数据成员的指针。std::function
使得函数可以作为一等公民在 C++ 中被使用和传递。
主要特性
-
通用性:
std::function
可以封装几乎任何类型的可调用对象,包括普通函数、lambda 表达式、std::bind
结果、函数指针、以及具有operator()
的对象。 -
类型擦除:
std::function
通过类型擦除(type erasure)技术,使得不同类型的可调用对象可以被统一存储和调用,而无需关心其具体类型。 -
空状态:
std::function
可以表示一个“空”状态,即没有封装任何可调用对象。此时调用它将引发std::bad_function_call
异常。
使用示例
#include <iostream>
#include <functional>
void foo(int x) {
std::cout << "foo(" << x << ")" << std::endl;
}
int main() {
// 封装普通函数
std::function<void(int)> f1 = foo;
f1(42); // 输出:foo(42)
// 封装 lambda 表达式
std::function<void(int)> f2 = [](int x) {
std::cout << "lambda(" << x << ")" << std::endl;
};
f2(42); // 输出:lambda(42)
// 封装 std::bind 结果
auto boundFunc = std::bind([](int x, const std::string& str) {
std::cout << str << "(" << x << ")" << std::endl;
}, std::placeholders::_1, "bound function");
std::function<void(int)> f3 = boundFunc;
f3(42); // 输出:bound function(42)
// 检查是否为空
std::function<void(int)> f4;
if (!f4) {
std::cout << "f4 is empty" << std::endl;
}
return 0;
}
注意事项
-
性能开销:由于
std::function
使用了类型擦除和动态内存分配,它可能带来一定的性能开销。在性能敏感的场合,应谨慎使用。 -
异常安全性:当
std::function
被复制或移动时,如果它封装了一个抛出异常的可调用对象,那么这些操作可能会抛出异常。 -
空
std::function
的调用:调用一个空的std::function
将导致std::bad_function_call
异常被抛出。
std::function
是 C++11 中一个非常强大的特性,它极大地增强了 C++ 中函数和可调用对象的灵活性和可用性。通过 std::function
,我们可以更方便地编写泛型代码,以及实现回调、事件处理等功能。