不同编译器中的输出行为
Output behaviour in different compilers
#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。
Y::Y();
C++是错误的。即使是 Dev C++也不应该允许这样做。
如果你的意思是为类Y
调用构造函数,你只需要创建一个类型Y
的对象,例如
Y my; //creates an object named my of type Y
Y my = Y(); //same as above
Y(); // creates a temporary object which is destroyed in the following line
If i replace statement 1 and 2 withh Y(); , the program produces the output in all 3. Why so?
输出是通过调用函数 Y::Y()
生成的。您可以在类 X 实例的构造函数中或通过直接调用函数来执行此操作。
但是,让我们看一下变体"语句 1"。代码
int main ()
{
X a;
}
创建一个未使用的变量。编译器可能会对其进行优化。在这种情况下,不会调用构造函数。这取决于编译器和实际使用的选项。当你直接调用函数 Y::Y(( 时,它不能被优化掉,你总是得到输出。
相关文章:
- C++编译器命令 C++ 不会生成输出
- 编译器资源管理器和 GCC 具有不同的输出
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- 在MSDOS编译器上,用大于最大值的值初始化int时输出混乱
- 我不明白我的编译器是如何获得此输出的
- C++编译器只显示数字,不显示正确的输出
- 乘以时输出错误.这是我编译器中的错误吗?C
- Web 编译器输出奇怪的结果
- 输出错误:两个不同编译器上的不同输出:Prime Cryptarithm USACO
- 编译器将输出的流运算符<<解释为用于按位左移的二进制运算符<<
- 构建 C/C++ 代码时的 Gradle 编译器输出
- C 编译器输出由于Permisson误差而未运行
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- VS说"Too few arguments...",但其他编译器给了我正确的输出?
- GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6
- 以下代码的输出是什么(答案因差异编译器而异)
- 简单构造函数的复杂编译器输出
- C++程序中的输出编译器版本
- 最后的所有输出——c++编译器