class my_class
{
...
my_class(my_class const &) = delete;
...
};
Co = delete
znaczy w tym kontekście?
Czy są jakieś inne „modyfikatory” (inne niż = 0
i = delete
)?
c++
function
c++11
declaration
delete-operator
Pat O'Keefe
źródło
źródło
#define
la a Qt, który został oceniony na 0, a następnie zadeklarował ukrytą funkcję lub coś w tym rodzaju.Odpowiedzi:
Usunięcie funkcji jest funkcją C ++ 11 :
źródło
=delete
sprawia , że metoda jest niedostępna nawet z kontekstów, które mogą zobaczyćprivate
metody (tj. W klasie i jej przyjaciołach). To usuwa wszelką niepewność podczas czytania kodu. @Prasoon, ten drugi przykład wciąż usuwa tylko konstruktory - fajnie byłoby zobaczyćoperator long ()
na przykład usunięte .= delete
jest lepsze niż używanieprivate
lub inne podobne mechanizmy, ponieważ zazwyczaj chcesz, aby zabroniona funkcja była widocznie zadeklarowana i uwzględniona w celu rozwiązania problemu przeciążenia itp., Aby mogła zakończyć się jak najwcześniej i dać użytkownikowi wyraźny błąd. Każde rozwiązanie obejmujące „ukrywanie” deklaracji zmniejsza ten efekt.= 0
oznacza, że funkcja jest czysto wirtualna i nie można utworzyć instancji obiektu z tej klasy. Musisz z niego skorzystać i wdrożyć tę metodę= delete
oznacza, że kompilator nie wygeneruje tych konstruktorów. AFAIK jest to dozwolone tylko w przypadku konstruktora kopiowania i operatora przypisania. Ale nie jestem zbyt dobry w nadchodzącym standardzie.źródło
=delete
składni. Możesz na przykład użyć go, aby jawnie zabronić jakiejś niejawnej konwersji, która może mieć miejsce podczas połączenia. W tym celu wystarczy usunąć przeciążone funkcje. Zajrzyj na stronę Wikipedii w C ++ 0x, aby uzyskać więcej informacji.= delete
nie jest całkowicie poprawny.= delete
może być użyty do dowolnej funkcji, w którym to przypadku jest wyraźnie oznaczony jako usunięty, a każde użycie powoduje błąd kompilatora. W przypadku specjalnych funkcji składowych oznacza to w szczególności, że nie są one generowane przez kompilator, ale jest to tylko wynikiem usunięcia, a nie tego, co= delete
naprawdę jest.Ten fragment książki The C ++ Programming Language [4th Edition] - Bjarne Stroustrup mówi o prawdziwym celu wykorzystania
=delete
:źródło
Ponieważ wydaje się, że nikt inny nie odpowiedział na to pytanie, powinienem wspomnieć, że istnieje również
=default
.https://docs.microsoft.com/en-us/cpp/cpp/explicitly-defaulted-and-deleted-functions#explicitly-defaulted-functions
źródło
Standardy kodowania, z którymi pracowałem, były następujące dla większości deklaracji klasowych.
Jeśli użyjesz któregoś z tych 6, po prostu skomentuj odpowiedni wiersz.
Przykład: klasa FizzBus wymaga tylko dtor, a zatem nie używa pozostałych 5.
Komentujemy tutaj tylko 1 i instalujemy implementację w innym miejscu (prawdopodobnie tam, gdzie sugeruje to standard kodowania). Pozostałe 5 (z 6) jest niedozwolone przy usuwaniu.
Możesz także użyć „= usuń”, aby zabronić niejawnych promocji wartości o różnych rozmiarach ... przykład
źródło
= delete
to funkcja wprowadzona w C ++ 11. Zgodnie z=delete
tym nie będzie można wywoływać tej funkcji.Szczegółowo.
Załóżmy w klasie.
Wywoływanie tej funkcji w celu przypisania obiektów nie jest dozwolone. Oznacza, że operator przypisania ograniczy kopiowanie z jednego obiektu do drugiego.
źródło
Nowy standard C ++ 0x. Patrz sekcja 8.4.3 w projekcie roboczym N3242
źródło
Usunięta funkcja jest domyślnie wbudowana
(Dodatek do istniejących odpowiedzi)
... A usunięta funkcja będzie pierwszą deklaracją funkcji (z wyjątkiem usuwania wyraźnych specjalizacji szablonów funkcji - usunięcie powinno nastąpić przy pierwszej deklaracji specjalizacji), co oznacza, że nie można zadeklarować funkcji, a następnie usunąć, powiedzmy, w swojej definicji lokalnej dla jednostki tłumaczeniowej.
Powołując się na [dcl.fct.def.delete] / 4 :
Szablon funkcji podstawowej z usuniętą definicją może być wyspecjalizowany
Chociaż ogólną zasadą jest unikanie specjalizacji szablonów funkcyjnych, ponieważ specjalizacje nie biorą udziału w pierwszym etapie rozwiązywania problemu przeciążenia, istnieją pewne konteksty, w których może to być przydatne. Np. Przy użyciu nie przeciążonego szablonu funkcji podstawowej bez definicji, aby dopasować wszystkie typy, których nie chciałoby się pośrednio konwertować na przeciążenie polegające na dopasowaniu przez konwersję; tj. w celu niejawnego usunięcia szeregu niejawnych dopasowań konwersji poprzez implementację tylko dopasowań dokładnych typów w wyraźnej specjalizacji niezdefiniowanego, nie przeciążonego szablonu funkcji podstawowej.
Przed koncepcją usuniętej funkcji w C ++ 11 można to zrobić, po prostu pomijając definicję szablonu funkcji podstawowej, ale dawało to niejasne, nieokreślone błędy referencyjne, które prawdopodobnie nie dawały żadnej intencji semantycznej autorowi szablonu funkcji podstawowej (celowo pominięto ?). Jeśli zamiast tego jawnie usuniemy szablon funkcji podstawowej, komunikaty o błędach w przypadku, gdy nie zostanie znaleziona odpowiednia wyraźna specjalizacja, staną się znacznie przyjemniejsze, a także pokażą, że pominięcie / usunięcie definicji szablonu funkcji podstawowej było celowe.
Jednak zamiast po prostu pominąć definicję powyższego szablonu funkcji podstawowej, powodując niejasny, niezdefiniowany błąd odniesienia, gdy żadna wyraźna specjalizacja nie pasuje, podstawową definicję szablonu można usunąć:
Daje bardziej czytelny komunikat o błędzie, w którym zamiar usunięcia jest również wyraźnie widoczny (gdzie nieokreślony błąd odniesienia może prowadzić do tego, że programista uzna to za nierozważny błąd).
Wracając do tego, dlaczego mielibyśmy chcieć korzystać z tej techniki? Ponownie, wyraźne specjalizacje mogą być przydatne do niejawnego usuwania niejawnych konwersji.
źródło
Jest to nowa rzecz w standardach C ++ 0x, w której można usunąć odziedziczoną funkcję.
źródło
void foo(int); template <class T> void foo(T) = delete;
Zatrzymuje wszystkie niejawne konwersje.int
Akceptowane są tylko argumenty typu, wszystkie inne spróbują utworzyć instancję funkcji „usuniętej”.