📅  最后修改于: 2023-12-03 14:39:54.284000             🧑  作者: Mango
C++11带来了几个有用的参数特性,其中最重要的是常量表达式(Constant expressions)和默认删除(Default deletions)。
常量表达式是指可以在编译时计算出结果的表达式。在C++11之前,只有整数类型和枚举类型的常量表达式是允许的。例如:
const int x = 42;
enum { y = 100 };
const int z = x + y; // OK
然而,C++11扩展了该规则,允许更多类型的常量表达式,包括浮点数、指针、引用、类类型等。例如:
constexpr double pi = 3.14159265358979323846;
constexpr int* p = nullptr;
constexpr std::size_t max_length = 100;
这些常量表达式可以用作数组大小、枚举值、模板参数等等。例如:
template <int N>
struct array {
int data[N];
};
array<10> a; // 定义了一个大小为10的数组
C++11引入了默认删除特性(default deletions),用于禁用类的某些成员函数(拷贝构造函数、拷贝赋值函数和析构函数)的默认生成。这样,可以强制该类的用户实现它们,以避免错误地创建出不带意义的行为(如深拷贝指针的浅拷贝)。
默认删除通过在函数声明后面加上=delete
来实现。例如:
class foo {
public:
foo() = default; // 默认构造函数
foo(const foo&) = delete; // 禁用拷贝构造函数
foo& operator=(const foo&) = delete; // 禁用拷贝赋值函数
~foo() = default; // 默认析构函数
};
这样,如果用户尝试使用禁用的成员函数,编译器将产生一个错误。例如:
foo a, b;
a = b; // 编译错误:'operator=' is implicitly deleted
foo c(a); // 编译错误:'foo::foo(const foo&)' is private
C++11的常量表达式和默认删除特性都是非常有用的,可以增强程序的类型安全和效率。但是,在使用它们时需要小心,以避免出现不必要的麻烦。