Un tipo no se puede construir a partir de una lista de argumentos si la declaración de variable inventada
T t(declval<Args>()...);
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
T(declval<Args>()...)
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 invocar const_cast
yreinterpret_cast
; El uso explícito de static_cast
restaura la equivalencia al formulario de declaración.
Como ejemplo concreto , considere los tipos:
struct D;
struct B { operator D&&() const; };
struct D : B {};
Aquí, static_cast
from B const
to D&&
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 el static_cast
daría el resultado incorrecto is_nothrow_constructible<D&&, B const>
.