Uso de rasgos de tipo C ++ 11 para proporcionar implementaciones en línea alternativas

¿Es razonable el siguiente patrón de código cuando se utilizan rasgos en código con plantilla donde ambas implementaciones alternativas son siempre compilables?

Leer el código parece más claro que hacer otras travesuras para compilar condicionalmente (pero quizás no estoy lo suficientemente familiarizado con esas travesuras).

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 complejidad añadida es, en parte, para proporcionar una fuerte garantía de excepción).

Sé que este código lo harátrabajo, pero ¿es razonable esperar que el compilador elimine las ramas falsas constantes y haga inlining, etc. para el caso noexcept (donde es mucho más simple que el otro caso)? Espero algo que sea tan eficiente en el caso sin excepción como escribir el método con solo ese primer bloque como cuerpo (y viceversa, aunque estoy menos preocupado por el caso complejo).

Si esta no es la forma correcta de hacerlo, ¿alguien puede aclararme la sintaxis recomendada?

Respuestas a la pregunta(6)

Su respuesta a la pregunta