segun - La respuesta no está clara c++
la verdadera historia de jesucristo libro (2)
Quien haya escrito la respuesta original a la prueba está equivocado.
- Este ejemplo proviene (exactamente) del propio estándar de C ++ , sección § 11/7, [class.access], y ha sido copiado por el que escribió la "prueba"
El ejemplo va más allá en el estándar, con plantillas (las omitiré aquí):
class A {
typedef int I; // private member
I f();
friend I g(I);
static I x;
};
A::I A::f() { return 0; }
A::I g(A::I p = A::x);
A::I g(A::I p) { return 0; }
A::I A::x = 0;
- Citando el estándar para la explicación:
Aquí, todos los usos de
A::I
están bien formados porqueA::f
yA::x
son miembros de la clase A yg es un amigo de la clase A. Esto implica, por ejemplo, que la verificación de acceso en la primera el uso deA::I
debe aplazarse hasta que se determine que este uso deA::I
es como el tipo de retorno de un miembro de la clase A.]
Aquí hay una pregunta de prueba:
Considere el siguiente código:
class A {
typedef int I; // private member
I f();
friend I g(I);
static I x;
};
¿Cuáles de los siguientes son válidos?
a. A::I A::f() { return 0; }
b. A::I g(A::I p = A::x);
c. A::I g(A::I p) { return 0; }
d. A::I A::x = 0;
La respuesta a esta pregunta se considera correcta solo la primera versión (a.), Pero ¿por qué? Todos ellos son válidos en mi opinión. Incluso probaron todos los que compilan con éxito. ¿Por qué solo la primera respuesta es correcta?
Todos ellos son válidos en C ++.
Aquí está el código exacto, es un ejemplo del propio estándar:
http://www.open-std.org/jtc1/sc22/open/n2356/access.html
Así es como los analizo:
a. A::I A::f() { return 0; } // defines A::f() which was previously prototyped
b. A::I g(A::I p = A::x); // declares prototype g(A::I), but doesn''t define it
c. A::I g(A::I p) { return 0; } // defines g(A::I)
d. A::I A::x = 0; // defines static storage for A::x which was previously declared in A
Todos estos se compilan, tanto individualmente como colectivamente.