Tomado de la implementación del CCG de type_traitspor qué se static_castnecesita aquí?
template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
: public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};
template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
: public integral_constant<bool,
// Why is `static_cast` needed here?
noexcept(static_cast<_Tp>(declval<_Arg>()))> {};
c++
typetraits
libstdc++
static-cast
João Pires
fuente
fuente

Respuestas:
Un tipo no se puede construir a partir de una lista de argumentos si la declaración de variable inventada
estaría bien formado y se sabe que no arroja excepciones . En el caso del argumento plural, esto es equivalente (módulo sin excepción de la destructibilidad, ver LWG 2116 ) a la buena formabilidad y la no expresión de la expresión de conversión de tipo
Sin embargo, en el caso de argumento único, la expresión
T(declval<Args>())se trata como una expresión de conversión , que puede invocarconst_castyreinterpret_cast; El uso explícito destatic_castrestaura la equivalencia al formulario de declaración.Como ejemplo concreto , considere los tipos:
Aquí,
static_castfromB consttoD&&debe usar el operador de conversión, pero una expresión de conversión puede omitir el operador de conversión y, por lo tanto, no es excepto. Omitir elstatic_castdaría el resultado incorrectois_nothrow_constructible<D&&, B const>.fuente
static_castse necesita para que la expresión siempre se trate como endirect initializationlugar de comocast expression?noexceptoperador, pero está mucho más cerca.