Retirado da implementação do GCC de type_traits
por que é static_cast
necessário aqui?
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
fonte
fonte
Respostas:
Um tipo não pode ser construído de uma lista de argumentos se a declaração da variável inventada
seria bem formado e é conhecido por não lançar exceções . No caso do argumento plural, isso é equivalente (módulo noexcept destrutibilidade, consulte LWG 2116 ) à boa formação e notowow da expressão de conversão de tipo
No entanto, no caso de argumento único, a expressão
T(declval<Args>())
é tratada como uma expressão de conversão , que pode chamarconst_cast
ereinterpret_cast
; o uso explícito destatic_cast
restaura a equivalência ao formulário de declaração.Como um exemplo concreto , considere os tipos:
Aqui um
static_cast
deB const
paraD&&
deve usar o operador de conversão, mas uma expressão de conversão pode ignorar o operador de conversão e, portanto, não é exceção. Portanto, omitir ostatic_cast
daria o resultado errado parais_nothrow_constructible<D&&, B const>
.fonte
static_cast
é necessário para que a expressão seja sempre tratada como emdirect initialization
vez de comocast expression
?noexcept
operador, mas é muito mais próximo.