删除和默认函数真实世界的例子

时间:2011-08-29 18:25:50

标签: c++ c++11

我正在研究C ++ 11的新功能,其中一个让我感到困惑,因为我无法找到在Real World中使用它的方法。

它是已删除和默认的函数,是否有人拥有它的实际使用示例,或者它只是添加一些糖的其中一个功能?

3 个答案:

答案 0 :(得分:9)

用户声明的特殊成员函数并不简单。如果一个类具有任何重要的特殊成员函数,则该类不是POD。因此,这种类型是POD:

struct S {
    S() = default;
    S(int) { }
};

但这种类型不是POD:

struct S {
    S() { }
    S(int) { }
};

答案 1 :(得分:8)

struct A
{
  A(const A& arg) : data(arg.data)
  {
    do_something_special();
  }

  // by writing copy constructor, we suppress the generation of
  // implicit default constructor A::A()

  int data;
};

void foo1()
{
  A a; // does not work, since there's no default constructor
}

假设我们的默认构造函数没有做任何特殊的操作,并且(或多或少)等于编译器生成的一个。我们可以通过编写我们自己的默认构造函数来修复它(如果我们的类有很多非静态成员,这会很繁琐),或者使用= default语法:

struct A
{
  A() = default;
  A(const A& arg) : data(arg.data)
  {
    do_something_special();
  }

  int data;
};

当我们想要禁止使用特定的重载或模板特化,或仅仅禁止复制(或移动)对象时,删除函数非常有用。

void foo(char c) {}
void foo(int i) = delete; // do not allow implicit int -> char conversion

当你想禁止复制(即线程对象)时,通常惯用的方法是声明私有拷贝构造函数而不实现(是的,或者使用boost :: noncopyable)。虽然这适用于大多数情况,但有时您可能会遇到一些模糊的链接器错误。考虑:

struct A
{
  A() = default;

  friend void foo();

private:
  A(const A&);
};

void foo()
{
  A a;
  A b(a); // results in linker error in gcc
}

删除A(const A&),我们避免了潜在的链接器错误,并使我们的意图(禁止复制)非常清楚。

答案 2 :(得分:1)

您可以将删除的函数用于要防止复制或直接实例化的类(例如,您想要执行get_instance()函数的单例)。你冷也使用删除来防止你的构造函数的某些变化。

如果您希望编译器生成的构造函数用于隐式生成的任何构造函数,则默认值很有用。例如,如果您创建自定义参数构造函数,编译器将不会生成默认的无参数,因此您可以要求使用default关键字为您生成它。

请参阅此处了解上述

的示例

http://www2.research.att.com/~bs/C++0xFAQ.html#default