2016-07-09 17 views
7

Rozważmy te dwa możliwe definicje klasy:Czy zadeklarowanie usuniętej funkcji nie ma sensu?

wykazują:

struct A 
{ 
    A() = delete; 
}; 

wykazują ':

struct A 
{ 
    A() noexcept = delete; 
} 

czy jest jakiś punkt w deklarując usuniętą funkcję jak noexcept?

+10

Po prostu nie. Usunięta funkcja nie może zostać wywołana (lub, w przypadku konstruktora, użyta do zainicjowania obiektu), nie mówiąc już o wyrzuceniu wyjątku. – Peter

Odpowiedz

7

(Wysłany ten początkowo jako komentarz, ale zaleca się dodawać jako odpowiedź.)

Proszę, nie. Usunięta funkcja nie może zostać wywołana (lub, w przypadku konstruktora, użyta do zainicjowania obiektu), nie mówiąc już o wyrzuceniu wyjątku.

Edit:

HVD wspomniano w komentarzach poniżej tego noexcept(f()) nie wymaga f(). Jeśli konstruktorem klasy A jest delete d, to noexcept(A()) nie powiedzie się skompilować, niezależnie od tego, czy konstruktor jest zadeklarowany jako noexcept. Jest to (w zasadzie) konsekwencją wymogu, aby noexcept(expression) nadano poprawne wyrażenie - a wyrażenie A() dla klasy wymaga prawidłowego konstruktora.

Revolver_Ocelot również poprawnie wskazuje, że nie ma możliwości przeciążenia na noexcept (tj. Nie jest możliwe posiadanie dwóch funkcji z tą samą sygnaturą, z tą różnicą, że jest to noexcept, a jedna nie jest). Tak więc, w ramach definicji klasy A oba mają ten sam efekt, tj. Klasa A nie ma konstruktora nie będącego argumentem.

+4

'noexcept' nie wpływa tylko na wywołanie funkcji. Masz rację, że jeśli nie można wywołać funkcji, nie ma to wpływu na wywołanie funkcji. Ale 'noexcept' może na ogół zrobić różnicę, nawet bez wywoływania czegokolwiek, najwyraźniej przez operatora' noexcept' ('noexcept (f())' nie wywołuje 'f()'). Myślę, że dobra odpowiedź powinna również wyjaśniać, dlaczego żaden z pozostałych przypadków nie ma zastosowania (na przykład, jeśli wszystkie te inne przypadki dotyczą tylko funkcji wywoływalnych, nie mają zastosowania do usuniętych funkcji) lub jeśli jest to możliwe (co podejrzewam, że jest to możliwe nie jest), daj kontrprzykład. – hvd

+1

Wspominanie, że nie można przeciążać 'noexcept' (w przeciwieństwie do, powiedzmy,' const') też byłoby pomocne. –

+0

Oboje macie rację, hvd i Revolver_Ocelot. Zmieniłem odpowiedź, aby uwzględnić (lub odpowiedzieć na) oba komentarze. Prosta odpowiedź "nie" nadal obowiązuje, a dodatkowe informacje, które wskazujesz, wspierają to. – Peter