Я недавно написал ниже простую программу, но компилятор показывает предупреждение.
#include <iostream>
int main()
{
int a();
std::cout<<a;
return 0;
}
[Warning] адрес 'int a()' всегда будет оцениваться как 'true' [-Waddress]
В чем смысл вышеупомянутого предупреждения? Почему значение a равно 1 не 0?
int a();
объявляет функцию, а не переменную. Если вы хотите быть нулевой инициализируется переменная, то вам нужен один из a
int a{}; // C++11 or later
int a = int();
int a(0);
int a = 0;
<<
не имеет перегрузки, которая может непосредственно принимать функцию; поэтому он ищет подходящую последовательность преобразования для типа, в котором она перегружена, и находит:
int() -> int(*)() -> bool
то есть, используя стандартные преобразования "от функции к указателю" и конверсии "указатель-в-булево". Указатель функции не будет пустым, так как объявленная функция должна существовать и иметь адрес; поэтому логическое значение будет true
.
Это может выглядеть как определение a
как int
, но:
int a();
объявляет функцию a
без параметров и возвращает int
.
Использование:
int a{};
вместо.
std::cout<<a;
вызывает operator<<()
с bool
который всегда отличен от нуля, отсюда и true
.
int a();
это объявление функции.