Rozważmy następujący tekst:Dlaczego mogę zadeklarować obiekt z usuniętym destruktorem?
[C++11: 12.4/11]:
destruktory są niejawnie wywoływany
- dla budowanych obiektów o okres przechowywania statyczne (3.7.1) na zakończenie programu (3.6.3),
- dla skonstruowana obiekty z czasem przechowywania wątku (3.7.2) przy wyjściu z gwintu,
- dla obiektów skonstruowanych z automatycznym czasem przechowywania (3.7.3), gdy blok, w którym utworzono obiekt, wychodzi (6.7),
- za wykonanie przejściowych obiektami, gdy żywotność tymczasowej końców przedmiotu (12,2),
- za wykonanie obiektów przypisanych przez nowej ekspresji (5.3.4), poprzez użycie usunąć ekspresji (5,3. 5),
- w kilku sytuacjach z powodu obsługi wyjątków (15.3).
Program jest źle sformułowany, jeśli zadeklarowano obiekt typu klasy lub jego tablicę, a destruktor klasy nie jest dostępny w miejscu deklaracji. Destruktory można również wywoływać jawnie.
Dlaczego program ten został pomyślnie skompilowany?
#include <iostream>
struct A
{
A(){ };
~A() = delete;
};
A* a = new A;
int main() {}
// g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
Czy GCC jest po prostu dozwolone?
jestem skłonny powiedzieć tak, ponieważ odrzuca następujące jeszcze the standard appears to have no particular rule specific to deleted destructors in an inheritance hierarchy (tylko luźno odpowiednie sformułowanie jest adekwatne do pokolenia dotrzymali domyślnych konstruktorów):
#include <iostream>
struct A
{
A() {};
~A() = delete;
};
struct B : A {};
B *b = new B; // error: use of deleted function
int main() {}
Nie ma czasu na standardowe nurkowanie, ale "dostępny" to nie to samo, co "nie usunięte". Jest publiczny. –
@ R.MartinhoFernandes: Myślę, że wpadłem już w tę pułapkę. –
To powiedziawszy, GCC nadal pozwala na to, nawet jeśli jest prywatne. –