📜  c++ 中 c11 的参数(1)

📅  最后修改于: 2023-12-03 14:39:54.284000             🧑  作者: Mango

C++11中的参数 (Arguments in C++11)

C++11带来了几个有用的参数特性,其中最重要的是常量表达式(Constant expressions)和默认删除(Default deletions)。

常量表达式(Constant expressions)

常量表达式是指可以在编译时计算出结果的表达式。在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的数组
默认删除(Default deletions)

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的常量表达式和默认删除特性都是非常有用的,可以增强程序的类型安全和效率。但是,在使用它们时需要小心,以避免出现不必要的麻烦。