2013-09-21 1 views
15
class A 
{ 
public: 
    A() = default; 
    A(const A&) = delete; 
}; 

class A 
{ 
public: 
    A() = default; 

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

Эти два определения всегда идентичны друг другу в любом случае?Должен ли удаленный конструктор быть закрытым?

+9

Я делаю свои удаленные функции общедоступными, потому что это ** объявление ** общедоступным пользователям, что оно не может быть построено по умолчанию (в вашем случае). – Nawaz

ответ

26

Они различаются только по изготовленной диагностике. Если вы сделаете это 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 ,

+5

+1. Я делаю свои удаленные функции общедоступными, потому что публичные пользователи ** сообщают **, что он не может быть сконфигурирован по умолчанию (в случае OP). – Nawaz

+3

@Nawaz Правильно, поэтому он также может считаться частью интерфейса/документации класса. –

2

Я хочу расширить Daniel Frey's answer. Вместо того, чтобы делать удаленные методы всегдаpublic, я бы предпочел дать эти методы модификатору доступа, который вы бы (гипотетически) дать эти методы, если они не будут удалены. (Я не люблю всегда в случае программист имеет возможность. Если это действительно будет вырезанные в камне, чтобы удаленные методы public, оно должно быть исполнено самим языком.)

Некоторые правила накатанной/руководящих принципов :

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

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