El uso del nombre calificado en función de parámetros
-
08-10-2019 - |
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).
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).