为什么我总是得到输出为1时,打印一个函数
Why am I always getting output as 1 when printing a function?
我想知道为什么当我打印这个函数时,我总是得到输出为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<<
,所以遵循这个顺序。
相关文章:
- 回溯C++不打印函数,因此文件
- 重写打印函数而不是覆盖基类
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 打印传递给打印函数的矢量
- 如何使用重新定义的打印函数打印Lua表?
- 调用和打印函数,在 C++ 中返回数组
- Lua C API 自定义打印函数,在字符串中传递空格时不调用
- C++二叉树打印函数实现
- 如何从主 C++ 向模板类中的方法发送打印函数
- 如果我不打印函数参数的值,则将其转换为等于零
- 打印函数模板的内容进行类指针
- C++打印函数的结果?
- 打印 C++ 函数
- 编写一个通用打印函数来打印数组
- 用于打印函数进入和退出跟踪的宏
- 每当尝试打印函数变量时,C++ cout 错误
- GDB:当没有可用的名称符号时,如何打印函数参数值
- 在lua中重新定义打印函数时出现问题
- 打印函数会返回一个意外值,原因是什么
- IntStack的C++递归打印函数