我最近写了下面简单的程序,但编译器显示警告。
#include <iostream>
int main()
{
int a();
std::cout<<a;
return 0;
}
[警告]'int a()'的地址将始终评估为'true'[-Waddress]
上述警告的含义是什么?为什么a的值是1而不是0?
答案 0 :(得分:3)
它可能看起来就像a
的定义一样int
,但是:
int a();
声明函数 a
不带参数并返回int
。
使用:
int a{};
代替。
std::cout<<a;
使用operator<<()
调用bool
,该true
始终为非零,因此{{1}}。
答案 1 :(得分:2)
int a();
声明一个函数,而不是一个变量。如果您希望a
为零初始化变量,那么您将需要
int a{}; // C++11 or later
int a = int();
int a(0);
int a = 0;
<<
没有可以直接获取函数的重载;所以它寻找一个合适的转换序列到它重载的类型,并找到:
int() -> int(*)() -> bool
即使用标准函数指针和指针布尔转换。函数指针不为null,因为声明的函数必须存在且具有地址;所以布尔值为true
。