Destructeurs et noexcept

Je suis un peu confondu avec les destructeurs et noexcept . D’après ce que noexcept(true) compris, en C ++ 11, tout destructeur, y compris celui défini par l’utilisateur, est implicitement noexcept(true) , même si on en throw . Et il faut spécifier explicitement noexcept(false) s’ils veulent qu’il en soit ainsi pour une raison quelconque.

Ce que je constate, c’est tout le contraire: avec GCC 4.7.2, le destructeur défini par l’utilisateur, quelle que soit la primitive de la classe et du destructeur, est implicitement noexcept(false) . Qu’est-ce que j’oublie ici? Existe-t-il des pièges cachés avec des destructeurs définis par l’utilisateur?

C’est un bogue connu (crédits de l’OP pour avoir trouvé le rapport de bogue), et il semble qu’il ait été corrigé dans GCC 4.8.0. Par exemple, l’assertion statique ci-dessous se déclenchera sur GCC 4.7.2, mais pas sur GCC 4.8.0:

 struct X { ~X() { }; }; int main() { X x; // This will not fire even in GCC 4.7.2 if the destructor is // explicitly marked as noexcept(true) static_assert(noexcept(x.~X()), "Ouch!"); }