Usando características do tipo C ++ 11 para fornecer implementações inline alternativas

O padrão de código a seguir é razoável ao usar traços no código de modelo em que ambas as implementações alternativas são sempre compiláveis?

Ler o código parece mais claro do que fazer outras travessuras para compilar condicionalmente (mas talvez eu não esteja familiarizado o suficiente com essas travessuras).

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
};

(A complexidade adicionada é em parte para fornecer a forte garantia de exceção.)

Eu sei que esse código vaitrabalhos, mas é razoável esperar que o compilador elimine as ramificações constantes e falsas e faça inlining etc. para o caso noexcept (onde muito mais simples que o outro caso)? Espero algo que seja tão eficiente no caso de exceção, como escrever o método apenas com o primeiro bloco como corpo (e vice-versa, embora eu esteja menos preocupado com o caso complexo).

Se esse não é o caminho certo, alguém pode me esclarecer a sintaxe recomendada?

questionAnswers(6)

yourAnswerToTheQuestion