namespace c++ templates language-lawyer using-declaration inheriting-constructors

using namespace c++



En declaración de uso, ¿se pueden representar los nombres dependientes a los constructores después de la sustitución de la plantilla? (1)

En este ejemplo:

template<class T> struct S : T { using T::X; };

T::X es un nombre dependiente que se refiere al miembro X en T Si S<T> se crea una instancia con T = X :

struct X { X(int) {} }; ... S<X> s(42);

¿Se convertirá la declaración de uso en un constructor hereditario?

Clang rechaza el código DEMO , mientras que g ++ lo acepta.

Tenga en cuenta que si escribimos:

using T::X::X;

Ambos compiladores aceptan el código y lo tratan como un constructor hereditario. ¿Se permite que using T::X convierta en heredero-constructor por estándar?


Gracias a TC por señalar esto:

El problema central 2070 , que se encuentra en la etapa de redacción (se confirma que es un problema y se está trabajando en la redacción de la solución), trata este caso. La solución propuesta requiere que ambas ID sean la misma ID para que este código sea aceptado como un constructor hereditario.

En este sentido, el mensaje de error de clang tiene sentido, ya que T :: X sería el tipo X, que activa el error "tipo desde plantilla sin etiqueta de nombre de tipo".

Mensaje original:

Entonces, me parece que la pregunta real es: "¿Es admisible que una creación de instancias de plantilla cambie el significado semántico de una declaración de uso?"

Y la respuesta es, no está desestimada. No sé si esta interacción fue prevista y pretendida por los autores de la norma. Pero por lo que puedo ver, haciendo referencia tanto a la declaración de uso en la Sección 10 como a la inicialización de la plantilla en la Sección 17, por la letra del estándar, sí, se permite using T::X y sí, la declaración de uso se convertirá en una herencia. constructor cuando T es X.