CodeWalk

C++11 =default与=delete的用法与场景

作者:孤独的心 · 2026-05-30 12:55

请说明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:禁止编译器生成或使用某个函数。

  1. 禁止拷贝/移动A(const A&) = delete; A& operator=(const A&) = delete;
  2. 禁止隐式转换void f(int); void f(double) = delete;阻止double隐式转int调用。
  3. 禁止operator newvoid* operator new(size_t) = delete;禁止栈/堆分配。
  4. 禁止模板特化:模板函数特定参数版本可用=delete

关键区别:=default只在特殊成员函数上可用;=delete可用于任何函数。