Должен ли удаленный конструктор быть закрытым?

class A
{
public:
A() = default;
A(const A&) = delete;
};

class A
{
public:
A() = default;

private:
A(const A&) = delete;
};

Всегда ли эти два определения идентичны друг другу в каких-либо случаях?

21

Решение

Они разные только по произведенной диагностике. Если вы сделаете это private, сообщается о дополнительном и лишнем нарушении доступа:

class A
{
public:
A() = default;
private:
A(const A&) = delete;
};

int main()
{
A a;
A a2=a;
}

результаты в следующем дополнительный вывод из GCC 4.8:

main.cpp: In function 'int main()':
main.cpp:6:5: error: 'A::A(const A&)' is private
A(const A&) = delete;
^
main.cpp:12:10: error: within this context
A a2=a;
^

отсюда моя рекомендация всегда делать удаленные методы public,

33

Другие решения

Я хочу продлить Ответ Дэниела Фрея. Вместо создания удаленных методов всегда publicЯ бы лучше дал этим методам модификатор доступа, который вы бы (гипотетически) дайте эти методы, если они не будут удалены. (Мне не нравится всегда в случае, если у программиста есть возможность. Если это действительно будет вырезано в камне, чтобы сделать удаленные методы public, это должно быть обеспечено самим языком.)

Некоторые практические правила / рекомендации:

  • Операторы назначения копирования и перемещения будут public в конкретных и абстрактных классах для большинства случаев.
  • Копировать и переместить конструкторы будут public в конкретных классах для большинства случаев.
  • Копировать и переместить конструкторы будут protected в абстрактных классах для большинства случаев.
  • Копировать и переместить конструкторы будут private в бетоне final классы, которые могут быть созданы только friends для большинства случаев.

Во всех случаях вы делаете объявление соответствующим пользователям класса, а не всем пользователям класса.

4

По вопросам рекламы [email protected]