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_castyreinterpret_cast ; El uso explícito de static_castrestaura 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_castfrom B constto 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_castdaría el resultado incorrecto is_nothrow_constructible<D&&, B const>.