Est le code suivant motif raisonnable lors de l'utilisation de traits d'basé sur un modèle de code où les deux implémentations alternatives sont toujours compilable?
La lecture du code semble plus clair que de faire d'autres manigances pour conditionnellement compiler (mais peut-être que je suis juste pas assez familiers avec ces manigances).
template<typename T>
class X
{
void do_something() noexcept(std::is_nothrow_copy_constructible<T>::value)
{
if (std::is_nothrow_copy_constructible<T>::value)
{
// some short code that assumes T's copy constructor won't throw
}
else
{
// some longer code with try/catch blocks and more complexity
}
}
// many other methods
};
(La complexité est en partie pour fournir la forte exception de garantie.)
Je sais que ce code de travail, mais est-il raisonnable de s'attendre à ce que le compilateur pour éliminer la constante de fausses branches et ne l'in-lining, etc pour la noexcept des cas beaucoup plus simple que les autres cas)? Je suis en espérant quelque chose qui serait aussi efficace dans les noexcept cas que l'écriture de la méthode avec seulement ce premier bloc que le corps (et vice-versa, même si je suis moins inquiet sur le cas complexe).
Si ce n'est pas la bonne façon de le faire, quelqu'un peut-il svp m'éclairer à la syntaxe recommandée?