Pregunta

De acuerdo con el estándar de C ++, el nombre del parámetro de la función es analizada por un declarador-id y un declarador-id también puede ser un nombre calificado. Eso significa que, el siguiente código es perfectamente válido (si he entendido las secciones pertinentes de la Norma correctamente):

template<class T>
struct Sample
{
    int fun(int T::count); //T::count is qualified variable name
};

Mi pregunta es, básicamente, ¿por qué alguien escribir dicho código? ¿En qué situaciones, el uso del nombre cualificado (en función del parámetro-list) puede ser ventajoso?


EDIT:

Parece que entendí las secciones de forma incorrecta. En lugar de que el código anterior, probablemente podemos escribir el siguiente código (según el estándar de C ++):

template<class T>
struct sample
{
  void fun(int arr[T::count]);
};

gcc-4.3.4 compila perfectamente. Pero entonces, no estoy totalmente satisfecho, porque T :: recuento no es un parámetro más (supongo).

¿Fue útil?

Solución

Es válido. La sintaxis permite declaradores arbitrarias, pero 8.3.5p8 dice

Un identificador puede ser opcionalmente proporcionado como un nombre de parámetro; Si presente en una definición de función (8.4), que nombra un parámetro (a veces llamado “argumento formal”)

Editar Otra cita que sintácticamente limitaciones declaradores (8.3p1, [dcl.meaning]):

Cada declarador contiene exactamente una declarador-id; que nombres el identificador que se ha declarado. El id-expresión de un declarador-id será un simple identificador a excepción de la declaración de algunas funciones especiales (12.3, 12.4, 13.5) y para la declaración de especializaciones plantilla o parcial especializaciones (14.7). A declarador-id no deberá ser calificado con excepción de la definición de una función miembro (9.3) o miembro estático de datos (9.4) o anidada clase (9.7) fuera de su clase, el definición o explícita de instancias de una función, variable o clase miembro de un espacio de nombres fuera de su espacio de nombres, o la definición de una declarada anteriormente explícita especialización fuera de su espacio de nombres, o la declaración de una amigo función que es miembro de otra clase o espacio de nombres (11.4).

Así que en una declaración de parámetros, no debe utilizar nombres cualificados.

Editar : En la forma editada, el tipo de parámetro función decae a un int*, incluso antes de una prueba se está haciendo si T::count en realidad existe y es una constante entera. Si quieres un ejemplo donde un nombre calificado en dicha firma haría algo significativo, considere

template<class T>
struct sample
{
  void fun(int S=T::count);
};

Cuando se llama a fun sin parámetros, las necesidades del compilador para determinar el argumento por defecto, que a su vez produce un error si T no tiene un miembro count, o que no pueden ser convertidos en int.

Otros consejos

Por lo que yo entiendo su código está formado enferma a causa

$ 8.3 / 1: Cuando el declarador-id se califica, la declaración se refiere a un miembro previamente declarado de la clase o espacio de nombres al que se refiere , y tampoco se debe haber introducido el miembro de la clasificación por un uso-declaración en el ámbito de la clase o espacio de nombres designados por el nombre-especificador anidado de la declarador-id. [Nota: Si el calificador es el operador de resolución de alcance mundial ::, la declarador-id se refiere a un nombre declarado en el ámbito del espacio de nombres global. ]

P.S: No estoy seguro al 100%. Por favor, corríjame si estoy equivocado. :)


¿En qué situaciones, el uso del nombre cualificado (en función del parámetro-list) puede ser ventajoso?

Leer elementos 31 y 32 de C ++ excepcional de Herb Sutter. Tanto los artículos se ocupan de búsqueda Koenig y el principio de interfaz.

Parece que entendí las secciones de forma incorrecta. En lugar de ese código, probablemente podemos escribir el siguiente código (según el estándar de C ++):

template<class T>
struct sample
{
  void fun(int arr[T::count]);
};

gcc-4.3.4 compila perfectamente. Pero entonces, no estoy totalmente satisfecho, porque T::count no es un parámetro más (supongo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top