int的默认构造函数

moo*_*eep 21 c++

可能重复:
为什么使用一组空括号来调用没有参数的构造函数是错误的?

在回答这个问题的时候,据说是这样的

int是默认构造为0,就像用int()初始化它们一样.其他原始类型被类似地初始化(例如,double(),long(),bool()等).

就在我向我的同事解释这个时,我编写了以下代码,编译(gcc-4.3.4)并运行,并观察到意外行为.

#include <iostream>

int main() {
  int i(); 
  std::cout << i << std::endl; // output is 1
}
Run Code Online (Sandbox Code Playgroud)

为什么是输出1,但0

Luc*_*ore 31

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

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

int i = int(); 
Run Code Online (Sandbox Code Playgroud)

  • @AntonioPérez我不希望大会有任何兴趣,而是愚蠢.相当于`std :: cout << true;`.(稍微有点)有趣的部分是编译器如何到达那里.```衰变到一个无法转换为`void*`的函数指针,所以`<<`的唯一有效重载是`bool`.仅当指针为空时,转换为bool才会产生false,但函数的地址不能为null,因此编译器通过直接注入"true"来优化转换. (10认同)
  • @DavidRodríguez-dribeas并继续:如果它的地址被采用,该函数被"使用",因此在某处没有定义是未定义的行为.但是,通常情况下......如果编译器优化了"use"(因为它知道地址是非空的),代码将编译并运行; 如果没有,你会在链接时得到一个未定义的符号. (3认同)