2012-12-29 154 views
4

嗨,大家好,我是C++新手(和SO),想知道为什么当我打印这个函数时总是会输出为1。好的这里的代码:打印功能时,为什么总是输出为1?

#include <iostream> 
using namespace std; 

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

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

+3

你知道,'x'不是'int',对不对?你似乎,但它不完全清楚你的问题...... –

+0

@ K-ballo我知道这一点。这是一个功能吗? –

+0

那你为什么期望它打印'0'? int的_value initialization_和那个有什么关系? –

回答

2
int x(int()); 

是“most vexing parse”的情况;您认为这是一个intint x)的声明,初始化为整数(int())的默认值;相反,编译器把它解释为一个函数返回一个int这需要作为一个参数(指针)函数不带任何参数,并返回一个声明的int(你可能会很麻烦声明由this site解释,或获得的一些更多的了解C型声明here)。

然后,当你这样做:

cout << x; 

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

注意,I” m不能完全确定这样的代码应该没有错误地被编译 - 你正在接受一个函数的地址,这个函数只是被声明而没有被定义;它真的,它不能进行评估,以比true其他任何东西,但原则上的线,你应该得到一个链接错误(由优化这里掩盖,这消除了x任何引用,因为它没有实际使用)。


你其实想的是:

int x=int(); 
1

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

这是一个标准转换序列,由一个函数到指针的转换,后跟一个布尔转换组成。

接下来的顺序是因为没有更好的重载operator<<

+0

为什么会发生? 'int()'返回0(刚刚测试过),无论如何将会被抛弃到'false'。 – slugonamission

+3

@slugonamission:'int x(int());'声明'x'作为一个函数(返回'int'并且带一个'int(*)()'参数)。在这种情况下,'x'不是int,并且'int()'不是临时的int。 – Mankarse

+0

我需要重新阅读语言规范。干杯:) – slugonamission