这是一个测试问题:
请考虑以下代码:
class A {
typedef int I; // private member
I f();
friend I g(I);
static I x;
};
以下哪项有效:
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;
这个问题的答案只被认为是正确的第一个版本(a。),但为什么?在我看来,它们都是有效的。甚至测试了所有他们成功编译。为什么只有第一个答案是正确的?
答案 0 :(得分:27)
谁写了测试的原始答案是错误的。
示例在标准中更进一步,使用模板(我将在此省略):
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;
此处
A::I
的所有用途都是格式正确的,因为A::f
和A::x
是 A类和G类的成员是A类的朋友。这意味着,因为 例如,首次使用A::I
时的访问检查必须是 推迟到确定A::I
的使用为止 A类成员的类型。]
答案 1 :(得分:4)
它们都是有效的C ++。
这是确切的代码,它是标准本身的一个例子:
http://www.open-std.org/jtc1/sc22/open/n2356/access.html
这是我解析它们的方式:
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
这些都是单独和集体编译的。