4

我想知道为什么当我打印这个函数时我总是得到输出为 1。这是代码:

#include <iostream>
using namespace std;

int main() {
    int x(int());
    cout << x; // 1
}

它总是打印出一个。为什么?我期待它输出 0,因为 int 默认为 0。那么为什么是 1?

4

2 回答 2

5
int x(int());

是“最令人头疼的解析”的一个案例;你认为这是一个int( int x) 的声明,初始化为 ints ( int()) 的默认值;相反,编译器将其解释为返回 an作为参数int的函数的int声明此处的类型声明)。

然后,当你这样做时:

cout << x;

x这里衰减到函数指针,但是没有函数指针的重载operator<<;给出一些有效重载的最简单的隐式转换operator<<是 to bool,并且,由于函数指针不能有 0 ( NULL) 值,所以它被评估为true,打印为 1。

请注意,我不完全确定这样的代码是否应该在没有错误的情况下编译——您正在获取一个仅声明且未定义的函数的地址;确实,它不能被评估为除 之外的任何东西true但原则上你应该得到一个链接器错误(这里被优化器掩盖,它删除了对 的任何引用x,因为它实际上并没有被使用)。


你真正想要的是:

int x=int();
于 2012-12-29T01:32:39.487 回答
2

该函数正在被转换为一个值bool并被打印为一个bool值。该函数位于非零地址,因此转换产生true.

这是一个标准的转换序列,包括函数到指针的转换,然后是布尔转换。

遵循顺序是因为没有更好的重载operator<<

于 2012-12-29T01:22:48.553 回答