Znaczenie = delete po deklaracji funkcji

class my_class
{
    ...
    my_class(my_class const &) = delete;
    ...
};

Co oznacza = delete w tym kontekście?

Czy są jakieś inne "modyfikatory" (inne niż = 0 i = delete)?

Author: Sam, 2011-04-01

8 answers

Usunięcie funkcji to funkcja C++11 :

Wspólny idiom "zakaz kopiowania" można teraz wyrazić bezpośrednio:

class X {
    // ...
    X& operator=(const X&) = delete;  // Disallow copying
    X(const X&) = delete;
};

[...]

Mechanizm "delete" może być użyty dla dowolnej funkcji. Na przykład, my może wyeliminować niepożądaną konwersję w ten sposób:

struct Z {
    // ...

    Z(long long);     // can initialize with an long long         
    Z(long) = delete; // but not anything less
};
 154
Author: Prasoon Saurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-05 11:56:36
  1. = 0 oznacza, że funkcja jest czysta wirtualnie i nie można utworzyć instancji obiektu z tej klasy. Musisz z niego wyprowadzić i zaimplementować tę metodę
  2. = delete oznacza, że kompilator nie wygeneruje tych konstruktorów dla Ciebie. AFAIK jest to dozwolone tylko w konstruktorze kopiującym i operatorze przypisania. Ale nie jestem zbyt dobry w nadchodzącym standardzie.
 71
Author: mkaes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-30 07:21:53

Ten fragment języka programowania C++ [4th Edition] - Bjarne Stroustrup książka mówi o prawdziwy cel za pomocą =delete:

Używanie domyślnej kopii lub move dla klasy w hierarchii jest zazwyczaj a disaster : biorąc tylko wskaźnik do bazy, po prostu nie wiemy, co członkowie, których klasa pochodna ma (§3.2.2), więc nie możemy wiedzieć, jak skopiować them . Tak więc najlepiej jest zazwyczaj usunąć domyślną kopię and move operacje, czyli wyeliminowanie domyślnych definicji te dwie operacje:

class Shape {
public:
  Shape(const Shape&) =delete; // no copy operations
  Shape& operator=(const Shape&) =delete;

  Shape(Shape&&) =delete; // no move operations
  Shape& operator=(Shape&&) =delete;
  ˜Shape();
    // ...
};

Teraz próba skopiowania kształtu zostanie przechwycona przez kompilator.

Mechanizm =delete jest ogólny, to znaczy może być użyty do stłumienia dowolnej operacji

 9
Author: Saurav Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 13:55:49

Czy są jakieś inne "modyfikatory" (inne niż = 0 i = delete)?

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

 4
Author: Kyle Delaney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 23:19:44

= delete jest funkcją wprowadzoną w C++11. Zgodnie z =delete nie będzie możliwe wywołanie tej funkcji.

W szczegółach.

Załóżmy, że w klasie.

Class ABC{
 Int d;
 Public:
  ABC& operator= (const ABC& obj) =delete
  {

  }
};

Podczas wywoływania tej funkcji do przypisania obj nie będzie dozwolone. Oznacza, że operator przypisania ograniczy kopiowanie z jednego obiektu do drugiego.

 2
Author: ashutosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-31 19:09:37

Nowy standard C++0x. Zob. sekcja 8.4.3 w projekcie roboczym N3242

 1
Author: dubnde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-04 08:26:59

Standardy kodowania, z którymi pracowałem, były następujące dla większości deklaracji klas.

  //  coding standard: disallow when not used
  T(void)                  = delete; // default ctor    (1)
  ~T(void)                 = delete; // default dtor    (2)
  T(const T&)              = delete; // copy ctor       (3)
  T(const T&&)             = delete; // move ctor       (4)
  T& operator= (const T&)  = delete; // copy assignment (5)
  T& operator= (const T&&) = delete; // move assignment (6)

Jeśli użyjesz którejś z tych 6, po prostu skomentujesz odpowiednią linię.

Przykład: Klasa FizzBus wymaga tylko dtor, a więc nie używa pozostałych 5.

//  coding standard: disallow when not used
FizzBuzz(void)                         = delete; // default ctor (1)
// ~FizzBuzz(void);                              // dtor         (2)
FizzBuzz(const FizzBuzz&)              = delete; // copy ctor    (3)
FizzBuzz& operator= (const FizzBuzz&)  = delete; // copy assig   (4)
FizzBuzz(const FizzBuzz&&)             = delete; // move ctor    (5)
FizzBuzz& operator= (const FizzBuzz&&) = delete; // move assign  (6)

Komentujemy tylko 1 tutaj, i instalujemy jego implementację gdzie indziej (prawdopodobnie tam, gdzie sugeruje standard kodowania). Pozostałe 5 (z 6) jest wyłączone z delete.

Możesz również użyć '=delete', aby uniemożliwić Ukryte promocje o różnych rozmiarach ... przykład

 // disallow implicit promotion's 
  template <class T> operator T(void)              = delete;
  template <class T> Vuint64& operator=  (const T) = delete;
  template <class T> Vuint64& operator|= (const T) = delete;
  template <class T> Vuint64& operator&= (const T) = delete;
 1
Author: 2785528,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 23:09:36

Jest to nowość w standardach C++ 0x, gdzie można usunąć dziedziczoną funkcję.

 0
Author: Tayyab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 13:22:04