大家好我是C ++(和SO)的新手,并想知道为什么我打印此功能时总是将输出设为1。好的,这是代码:
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
它总是打印一个。为什么?我期待它输出0,因为整数被默认为0.那么为什么1?
答案 0 :(得分:2)
int x(int());
是“most vexing parse”的情况;你认为这是一个int
(int x
)的声明,初始化为int的默认值(int()
);相反,编译器将其解释为返回int
的函数的声明,该函数将参数a(指向)函数作为参数,该函数不接受任何参数并返回int
(您可以获得由毛茸茸的声明解释this site,或者更多地了解C类型声明here)。
然后,当你这样做时:
cout << x;
x
这里衰减到函数指针,但是operator<<
没有带有函数指针的重载;给operator<<
的一些有效重载的最简单的隐式转换是bool
,并且,由于函数指针不能具有0(NULL
)值,因此它被计算为{{1} },打印为1。
请注意,我并不完全确定应该编译这样的代码而不会出错 - 您将获取仅声明且未定义的函数的地址; 是真的,它不能被评估为true
以外的任何东西,但是原则上你应该得到一个链接器错误(这里被优化器屏蔽掉了,它删除了对{{{{{ 1}},因为它实际上没有使用过。)
你真正想要的是:
true
答案 1 :(得分:1)
该功能正在转换为bool
,并打印为bool
值。该函数位于非零地址,因此转换生成true
。
这是一个标准的转换序列,包括一个函数到指针的转换,然后是一个布尔转换。
遵循序列,因为没有更好的重载operator<<
。