这是一个测试问题:
请考虑以下代码:
class A {
typedef int I; // private member
I f();
friend I g(I);
static I x;
};
Run Code Online (Sandbox Code Playgroud)
以下哪项有效:
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;
Run Code Online (Sandbox Code Playgroud)
这个问题的答案只被认为是正确的第一个版本(a.),但为什么?在我看来,它们都是有效的.甚至测试了所有他们成功编译.为什么只有第一个答案是正确的?
qua*_*dev 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;
Run Code Online (Sandbox Code Playgroud)
在这里,所有的用法
A::I都是格式良好的,因为A::f并且A::x是A类的成员,g是A类的朋友.这意味着,例如,A::I必须推迟对第一次使用的访问检查, 直到确定这个用途为止. ofA::I作为A类成员的返回类型.]