jeudi 26 mars 2015

C++11 virtual destructors and auto generation of move special functions

The rules for auto generating special move functions (constructor and assignment operator) in C++11 specify that no destructor can be defined. The logic is presumably that, if you need to do something special in destruction, that a move may not be safe.


However, for proper destructor calls in polymorphism, it is necessary to define a base classes' destructor as virtual (otherwise deleting an instance of a sub class through a pointer of its base class will not properly chain the destructor).


I'm assuming, then, that even an empty destructor would prevent the compiler from automatically generating a special move functions. As in:



class Base {
virtual ~Base() { }
};


You can, however, default the destructor, as in:



class Base {
virtual ~Base() = default;
}


So question 1: Will this allow the compiler to auto generate special move functions?


There is a problem with the explicit default destructor, however. In at least the case of GCC 4.8.2, the signature is implicitly changed to noexcept. As in:



class Base {
virtual ~Base() = default; // compiler changes to:
// virtual ~Base() noexcept;
}


While I have no problem with noexcept in a destructor, this would break the following "client" code:



class Sub : public Base {
virtual ~Sub(); // this definition is now "looser" because of no noexcept
}


So question 2 is more to the point: is there a way to allow auto generation of special move functions in C++11 and allow proper destructor chaining to sub classes (as described above), all without breaking subclass ("client") code?


Aucun commentaire:

Enregistrer un commentaire