3
4

2 回答 2

17

ais not an int:它是一个没有参数并返回一个int. 因为它是一个函数声明,a也不是一个局部变量,它没有“默认值”。

该程序格式错误,因为您从未定义函数a但您尝试使用它(通过在插入表达式中获取其地址)。因此,它违反了单一定义规则。

如果你a在程序中定义,1会被打印出来,因为函数的地址a会被转换为booloperator<<bool参数的重载是函数指针参数类型的最佳匹配。

[注意:如果你a用 Visual C++ 定义和编译,它会打印函数的地址,而不是1. 这是(我认为)因为 Visual C++ 允许将函数指针隐式转换为void*,然后operator<<具有void const*参数的重载是函数指针参数类型的最佳匹配。如果您在禁用语言扩展 ( ) 的情况下进行编译,则将按预期选择/Za带有参数的重载。]bool

于 2012-08-01T03:00:14.053 回答
4

正如 James McNellis 所说,您不是在声明一个 int,而是在声明一个函数。

但是,您可以使用默认值初始化 int,如下所示:

int i = int();

而且默认值不是1,是0。

std::cout << "this prints '0': " << int() << '\n';

在 C++11 中,您可以使用统一初始化:

int i {};

花括号不会像圆括号那样混淆函数声明的一部分。

于 2012-08-01T04:22:00.420 回答