¿T tiene que ser un tipo completo para ser usado en `std::declval<T>`?

¿T tiene que ser un tipo completo para ser usado en `std::declval<T>`?

La fuente del error no es std::declval , pero acceso de miembro de clase incompleto.

Hasta que se fusionó la resolución de CWG1836 hace 2,5 años, el estándar requería que la clase estuviera completa en una expresión de acceso de miembro de clase (E1.E2 ).
[expr.ref]/2 en C++11:

[expr.ref]/2 en C++17:

Y una clase no se considera completa en alias-declaration dentro de su propio member-specification .
[clase.mem]/6 en C++17:


De [declval]:

Esta redacción ha estado presente desde C++ 11 (por lo que no es posible que los compiladores se ajusten a un estándar anterior)