gpt4 book ai didi

c++ - 不同编译器中的输出行为

转载 作者:行者123 更新时间:2023-11-30 01:57:36 26 4
gpt4 key购买 nike

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com