Tomado de la implementación del CCG de type_traits
por qué se static_cast
necesita 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_cast
yreinterpret_cast
; El uso explícito destatic_cast
restaura la equivalencia al formulario de declaración.Como ejemplo concreto , considere los tipos:
Aquí,
static_cast
fromB const
toD&&
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_cast
daría el resultado incorrectois_nothrow_constructible<D&&, B const>
.fuente
static_cast
se necesita para que la expresión siempre se trate como endirect initialization
lugar de comocast expression
?noexcept
operador, pero está mucho más cerca.