name keywords google etiquetas ejemplos c++ friend

c++ - keywords - meta tags seo



Se debe declarar una clave de clase al declarar un amigo. (2)

Hasta el punto de su pregunta, porque es la forma en que ISO / IEC 14882: 2003 lo especifica (sección 7.1.4). El constructo friend se especifica esencialmente como:

friend <declaration>

donde <declaration> es la declaración válida de una clase, estructura, plantilla o función.

Así,

MyClass;

No es una declaración válida, mientras que:

class MyClass;

o:

struct MyClass;

son.

Idem para, correspondientemente:

friend class MyClass;

o

friend struct MyClass;

El compilador g ++ se queja con este error cuando declaro un amigo de esta manera:

friend MyClass;

en lugar de

friend class MyClass;

¿Por qué la palabra clave de clase debería ser requerida? (El compilador Borland C ++, por cierto, no lo requiere.)

¿No podría el compilador simplemente buscar MyClass en la tabla de símbolos y decir que fue declarado como una clase? (Obviamente, está haciendo la búsqueda de todos modos porque se queja cuando MyClass no está declarada)

No es como hacer una declaración hacia adelante de la clase: todavía tengo que haber declarado la clase anterior o al menos haberla declarado hacia adelante.

Tendría sentido para mí (sería genial en realidad) si

friend class MyClass;

hace una declaración hacia adelante si es necesario, de lo contrario, me parece una sal sintáctica.

He estado usando alegremente declaraciones de amigos sin la palabra clave de clase o estructura sin quejas del compilador durante casi 20 años. ¿Es esto algo bastante nuevo?


Me sorprendió esto (y como resultado eliminé una respuesta incorrecta anterior). El estándar C ++ 03 dice en 11.4:

Se utilizará un especificador de tipo elaborado en una declaración de amigo para una clase.

Luego, para asegurarse de que no haya malentendidos, se hace referencia a eso con:

Se requiere la clave de clase del especificador de tipo elaborado.

GCC es el único compilador que tengo que se queja de la clave de clase faltante, pero parece que otros compiladores nos están dejando escapar con algo no estándar ...

Ahora, en cuanto al razonamiento, tendrías que preguntarle a alguien que sabe más sobre compiladores (o estándares) que yo.