我想知道为什么当我打印这个函数时我总是得到输出为 1。这是代码:
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
它总是打印出一个。为什么?我期待它输出 0,因为 int 默认为 0。那么为什么是 1?
我想知道为什么当我打印这个函数时我总是得到输出为 1。这是代码:
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
它总是打印出一个。为什么?我期待它输出 0,因为 int 默认为 0。那么为什么是 1?
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();
该函数正在被转换为一个值bool
并被打印为一个bool
值。该函数位于非零地址,因此转换产生true
.
这是一个标准的转换序列,包括函数到指针的转换,然后是布尔转换。
遵循顺序是因为没有更好的重载operator<<
。