¿Es cierto que una declaración unique_ptr, a diferencia de una declaración auto_ptr, está bien definida cuando su tipo de plantilla es de un tipo incompleto?

escribíEste artículo Y recibí algunos comentarios que me confundieron.

Básicamente se reduce a lo que he vistoT2 Usado solo como parámetro de plantilla y erróneamente salté a la conclusión de que, por lo tanto, podría aprovechar la oportunidad de enviar una declaración:

struct T2;

struct T1
{
    std::auto_ptr<T2> obj;
};

Esto invoca a UB si no voy a definir.T2&nbsp;En algún lugar del mismo TU, porquestd::auto_ptr<T2>&nbsp;llamadasdelete&nbsp;en su interiorT2*yvocacióndelete&nbsp;en un puntero a un objeto de un tipo incompleto cuyo tipo completo tiene un destructor no trivial no está definido:

[C++11: 5.3.5/5]:&nbsp;Si el objeto que se está eliminando tiene un tipo de clase incompleto en el punto de eliminación y la clase completa tiene un destructor no trivial o una función de desasignación, el comportamiento no está definido.

La cadena de herramientas de GCC que estaba usando, v4.3.3 (Sourcery G ++ Lite 2009q1-203), fue lo suficientemente amable como para avisarme con una nota:

nota: no se llamará al destructor ni a la eliminación del operador específico de la clase, incluso si se declaran cuando se define la clase.

aunque parece difícil obtener este diagnóstico en otras versiones de GCC.

Mi queja fue que sería mucho más fácil detectar un error como este sideleteun puntero a una instancia de un tipo incompleto fueronmal formado&nbsp;en lugar de UB, pero eso parece ser un problema intratable para una implementación, así que entiendo por qué es UB.

Pero luego me dicen que, si tuviera que usarstd::unique_ptr<T2>&nbsp;en su lugar, esto sería seguro y compatible.

n3035 supuestamente dice en 20.9.10.2:

El parametro de la plantillaT&nbsp;deunique_ptr&nbsp;Puede ser un tipo incompleto.

Todo lo que puedo encontrar en C ++ 11 es:

[C++11: 20.7.1.1.1]:

/ 1&nbsp;La plantilla de clasedefault_delete&nbsp;sirve como el eliminador predeterminado (política de destrucción) para la plantilla de claseunique_ptr.

/ 2&nbsp;El parametro de la plantillaT&nbsp;dedefault_delete&nbsp;Puede ser un tipo incompleto.

Pero,default_deleteesoperator()&nbsp;Requiere un tipo completo:

[C++11: 20.7.1.1.2/4]:&nbsp;SiT&nbsp;Es un tipo incompleto, el programa está mal formado.

Supongo que mi pregunta es esta:

¿Son correctos los comentaristas de mi artículo al decir que una unidad de traducción que consta solo del siguiente código está bien formada y bien definida? ¿O están equivocados?

struct T2;

struct T1
{
    std::unique_ptr<T2> obj;
};

Si son correctos, ¿cómo se espera que un compilador implemente esto, dado que hay buenas razones para ser UB, al menos cuandostd::auto_ptr&nbsp;se utiliza?