为什么我总是得到输出为1时,打印一个函数

Why am I always getting output as 1 when printing a function?

本文关键字:打印 函数 一个 1时 输出 为什么      更新时间:2023-10-16

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

#include <iostream>
using namespace std;
int main() {
    int x(int());
    cout << x; // 1
}

它总是输出一个。为什么?我期望它输出0,因为int值默认为0。为什么是我?

int x(int());

是"most vexing parse"的一个例子;你认为这是一个声明的int (int x)初始化为int (int())的默认值;相反,编译器将其解释为返回int的函数声明,该函数将不接受参数的函数(指针指向)作为参数,并返回int(您可以在本网站获得令人发指的声明,或者在这里获得更多关于C类型声明的理解)。

然后,当你这样做的时候:

cout << x;

x衰变为函数指针,但operator<<没有重载,接受函数指针;提供有效的operator<<重载的最简单的隐式转换是到bool,并且,由于函数指针不能有0 (NULL)值,因此它被求值为true,输出为1。

请注意,我不能完全确定这样的代码应该没有错误编译-你正在接受一个函数的地址,只是声明而不是定义;如果为真,它不能求值为true以外的任何值,但原则上您应该得到一个链接器错误(这里由优化器掩盖,删除了对x的任何引用,因为实际上没有使用它)。


你真正想要的是:

int x=int();

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

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

因为没有更好的重载operator<<,所以遵循这个顺序。