Удаленные и дефолтные функции Примеры из реального мира - PullRequest
8 голосов
/ 29 августа 2011

Я смотрел на новые функции C ++ 11, и одна из них сбила меня с толку, потому что я не могу найти способ использовать его в реальном мире.

Это удаленные и дефолтные функции, есть ли у кого-нибудь реальные примеры его использования или это просто одна из тех функций, которая просто добавляет немного сахара?

Ответы [ 3 ]

9 голосов
/ 29 августа 2011

Объявленная пользователем специальная функция-член не является тривиальной. Если класс имеет какие-либо нетривиальные специальные функции-члены, класс не является POD. Следовательно, этот тип POD:

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

но этот тип не POD:

struct S {
    S() { }
    S(int) { }
};
8 голосов
/ 29 августа 2011
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&) исключено, мы избегаем потенциальных ошибок компоновщика и делаем наше намерение (запретить копирование) очень ясным.

1 голос
/ 30 августа 2011

Вы можете использовать удаленные функции для классов, где вы хотите предотвратить копирование или прямое создание экземпляров, например (а-ля singleton, где вместо этого вы хотите использовать функцию get_instance ()).Вы также можете использовать delete, чтобы предотвратить определенные вариации вашего конструктора.

Значение по умолчанию полезно, если вы хотите, чтобы конструктор, сгенерированный компилятором, был сгенерирован неявно.Например, если вы создадите пользовательский конструктор аргументов, компилятор не сгенерирует аргумент по умолчанию без аргумента один, поэтому вы можете попросить его сгенерировать его с ключевым словом по умолчанию.

См. Здесь примеры выше

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...