W języku C++ 11 można jawnie ustawić domyślną funkcję składową członkowską, jeśli jej automatyczne generowanie zostało automatycznie zablokowane.Wymuszanie jawnie domyślnej funkcji generowania specjalnych funkcji składowych
Jednak jawne domyślne użycie funkcji specjalnej powoduje tylko cofnięcie niejawnego usunięcia spowodowanego przez ręczne zadeklarowanie niektórych innych funkcji specjalnego elementu (operacje kopiowania, destruktora itd.), Nie zmusza kompilatora do wygenerowania funkcji i kod jest uważany za dobrze uformowany, nawet jeśli funkcja nie może być w rzeczywistości wygenerowana.
Rozważmy następujący scenariusz:
struct A
{
A() = default;
A (const A&) = default;
A (A&&) = delete; // Move constructor is deleted here
};
struct B
{
B() = default;
B (const B&) = default;
B (B&&) = default; // Move constructor is defaulted here
A a;
};
Konstruktor ruch w B nie zostanie wygenerowany przez kompilator, ponieważ spowodowałoby błąd kompilacji (ruch konstruktora jest usunięte). Bez jawnego usunięcia konstruktora A konstruktor ruchu B byłby generowany zgodnie z oczekiwaniami (kopiowanie A, zamiast go przesuwać).
Próba przenieść taki obiekt dyskretnie użyć konstruktora kopii zamiast:
B b;
B b2 (std::move(b)); // Will call B's copy constructor
Czy istnieje sposób zmusić kompilator do generowania albo funkcję albo wydać błąd kompilacji, jeśli nie może? Bez tej gwarancji trudno jest polegać na domyślnych konstruktorach ruchu, jeśli pojedynczy usunięty konstruktor może wyłączyć ruch dla całych hierarchii obiektów.
Nie powinieneś wiedzieć, czy członkowie, do których się dodajesz, są ruchome czy nie? – NathanOliver
Mogą być ruchome, gdy klasa została pierwotnie zaimplementowana, jednak jeśli później zostaną dodane kolejne elementy, można pominąć wymóg ruchomy (szczególnie jeśli są one dodawane przez kogoś innego). –
Należy zauważyć, że typ, który usuwa konstruktor ruchu, ale * nie * jego konstruktor kopii jest bardzo ... dziwaczny. Nie ma absolutnie nic do zyskania, robiąc to. Najlepiej więc zignorować tę sprawę, biorąc pod uwagę, że jest to wynikiem tego, że ktoś robi coś idiotycznego bez powodu. –