class A
{
public:
A() = default;
A(const A&) = delete;
};
class A
{
public:
A() = default;
private:
A(const A&) = delete;
};
Всегда ли эти два определения идентичны друг другу в каких-либо случаях?
Они разные только по произведенной диагностике. Если вы сделаете это 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
,
Я хочу продлить Ответ Дэниела Фрея. Вместо создания удаленных методов всегда public
Я бы лучше дал этим методам модификатор доступа, который вы бы (гипотетически) дайте эти методы, если они не будут удалены. (Мне не нравится всегда в случае, если у программиста есть возможность. Если это действительно будет вырезано в камне, чтобы сделать удаленные методы public
, это должно быть обеспечено самим языком.)
Некоторые практические правила / рекомендации:
public
в конкретных и абстрактных классах для большинства случаев.public
в конкретных классах для большинства случаев.protected
в абстрактных классах для большинства случаев.private
в бетоне final
классы, которые могут быть созданы только friends
для большинства случаев.Во всех случаях вы делаете объявление соответствующим пользователям класса, а не всем пользователям класса.