【问题标题】:default constructor for int [duplicate]int的默认构造函数[重复]
【发布时间】:2012-06-22 11:10:03
【问题描述】:

可能重复:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?

在对this question 的回复中,据说

ints 被默认构造为 0,就像你用 int() 初始化它们一样。其他基本类型的初始化方式类似(例如,double()、long()、bool() 等)。

就在我向我的一位同事解释这一点时,我编写了以下代码 compiled (gcc-4.3.4) and ran,并观察到了意外行为。

#include <iostream>

int main() {
  int i(); 
  std::cout << i << std::endl; // output is 1
}

为什么输出是1 而不是0

【问题讨论】:

标签: c++


【解决方案1】:

最令人头疼的解析在这里发挥作用。您实际上是在声明一个函数 i,而不是 int 变量。它甚至不应该编译(除非您实际上在某处定义了一个函数 i...是吗?)。

要对 int 进行值初始化,您需要:

int i = int(); 

【讨论】:

  • 我认为是隐式转换为bool
  • 以前版本的GCC一定是bug;在 4.7 中,它无法编译。
  • @moooeeeep 是的,但这里的重要部分是 i 不是 int - 请参阅 ideone.com/f7bEP
  • @AntonioPérez 我不希望大会有任何兴趣,而是愚蠢。相当于std::cout&lt;&lt;true;。 (稍微)有趣的部分是编译器是如何到达那里的。 i 衰减为无法转换为void* 的函数指针,因此&lt;&lt; 的唯一有效重载是采用bool 的重载。仅当指针为空时转换为布尔型才会产生假,但函数的地址不能为空,因此编译器通过直接注入true来优化转换。
  • @DavidRodríguez-dribeas 并继续:如果函数的地址被占用,则该函数被“使用”,因此在某处缺少定义是未定义的行为。但是,通常...如果编译器优化了“使用”输出(因为它知道地址是非空的),代码将编译并运行;如果没有,链接时会得到一个未定义的符号。
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 2014-07-05
  • 2019-01-27
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多