C++11 =default与=delete的用法与场景
请说明C++11中=default和=delete的语法和典型使用场景,包括如何控制特殊成员函数的生成、禁止拷贝/移动、delete其他重载(如防止隐式转换)。
回答
孤独的心
=default:显式要求编译器生成默认版本的特殊成员函数。
struct A {
A() = default; // 默认构造函数
A(const A&) = default; // 默认拷贝构造
A(A&&) = default; // 默认移动构造
A& operator=(const A&) = default;
~A() = default;
};
- 适用于:希望保留默认行为但又需要显式声明(如因其他自定义构造函数导致默认构造不生成)。
- 可在类外定义(
A() = default;在类内,或A::A() = default;在cpp中)。
=delete:禁止编译器生成或使用某个函数。
- 禁止拷贝/移动:
A(const A&) = delete; A& operator=(const A&) = delete; - 禁止隐式转换:
void f(int); void f(double) = delete;阻止double隐式转int调用。 - 禁止operator new:
void* operator new(size_t) = delete;禁止栈/堆分配。 - 禁止模板特化:模板函数特定参数版本可用
=delete。
关键区别:=default只在特殊成员函数上可用;=delete可用于任何函数。