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

标签 c++

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

相关文章:

c++ - GCC: "__unused__"与变量属性中的 "unused"

c++ - 你能在 C++ 中使用 'new' 模拟动态数组大小吗?

c++ - 从 Excel 到 utf-8 mysql 的字符串

c++ - sizeof(char *) 是做什么的?

c++ - 带枚举的模板需要了解

c++ - 计算 n 个数字之和的递归函数的意外输出

c++ - 什么是 do(keyword) c++?

c++ - 如何使用 std::find 查找唯一编号

python - Python中的递增迭代器(iter)

c++ - 将 “Extension methods support” 添加到 C++ 的错误指针分配技巧将来会成为问题吗?