c++ - una - ¿Cómo se puede usar un tipo incompleto como parámetro de plantilla para vectorizar aquí?
vectorizar imagen inkscape (1)
Creo que en la práctica esto puede funcionar, pero por lo que puedo decir, esto parece un comportamiento indefinido. Del borrador de la norma C ++ 11 17.6.4.8
[res.on.functions] :
En particular, los efectos no están definidos en los siguientes casos:
[...]
- si se utiliza un tipo incompleto (3.9) como argumento de plantilla al crear una instancia de un componente de plantilla, a menos que se permita específicamente para ese componente.
Aunque crear una instancia de un componente de plantilla no parece ser un término bien definido.
Llegué a esto a través del defecto 611 de LWG que agregó:
a menos que se permita específicamente para el componente.
hasta el final de la bala anterior, por lo que ahora se lee:
si se utiliza un tipo incompleto (3.9) como un argumento de plantilla al crear una instancia de un componente de plantilla, a menos que se permita específicamente para el componente.
como excepción para shared_ptr
ya que la cita anterior entró en conflicto con esta cita de 20.6.6.2
[util.smartptr.shared]:
El parámetro de plantilla T de shared_ptr puede ser un tipo incompleto.
Consulte también N4371: Soporte de tipo incompleto mínimo para contenedores estándar, revisión 2 .
TIL el siguiente programa es legal y todo eso:
#include <vector>
struct Bar;
struct Foo
{
using BarVec = std::vector<Bar>::size_type;
};
struct Bar {};
int main()
{
Foo f;
}
¿Cómo? Bar
es un tipo incompleto, por lo que el compilador no tiene manera de saber qué es std::vector<Bar>
, o que contiene un miembro size_type
, o que el miembro size_type
es un tipo.
La única explicación que se me ocurre es que cualquier especialización hipotética (presumiblemente) ya debería estar dentro del alcance para hacer que size_type
un significado diferente al dado en la definición de la plantilla "base", y size_type
no es un nombre dependiente (Ambos factores contribuyen a la certeza del compilador).
¿Cuál es la razón legal aquí?