#include <iostream>
class Y
{
public:
Y();
};
class X
{
public:
void foo() {}
friend Y::Y();
X()
{
Y::Y(); //Statement 1
}
};
Y::Y()
{
std::cout << "Hello";
}
int main()
{
X a;
Y::Y(); //Statenent 2
}
以上程序在 Dev c++ 和键盘上生成输出 HelloHello
。但是当我在 Code::Blocks 上运行时,它给出了错误 remove the reduntant Y::
如果我用 Y();
替换语句 1 和 2,程序会生成所有 3 个输出。为什么会这样?
最佳答案
在每个类 X
中,X
可用于引用该类。这允许,例如,
struct X {
struct Y {
static int f();
};
};
int X::Y::f() {
Y y;
return 0;
}
int main() {
return X::Y::f();
}
工作,即使 Y
似乎 不在 X::Y::f
定义的范围内。
标准指定的方式已经改变。在最初的 C++ 标准中,Y
被简单地视为 ::X::Y
的成员,并且意味着 ::X::Y
.这种解释使得不可能引用构造函数,因为 X::X
始终是一种类型。因此,在第一个 TC 中,标准被更改为使 X::X
引用类型的构造函数(在大多数情况下)。
您的一个编译器实现了原始的 C++ 规则,另一个实现了更新的规则。
按照最初的规则,Y::Y();
只是桃色的。你正在构建一个类型。该类型具有可访问的构造函数,因此没有问题。
根据较新的规则,Y::Y();
是一个错误。您正在调用构造函数,但不允许显式调用构造函数。
对于那些感兴趣的人,这是核心语言问题 147。
关于c++ - 不同编译器中的输出行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18532934/