Что означает это предупреждение в orwell dev C ++ IDE? [Дубликат]

0

Я недавно написал ниже простую программу, но компилятор показывает предупреждение.

#include <iostream>
int main()
{
    int a();
    std::cout<<a;
    return 0;
}

[Warning] адрес 'int a()' всегда будет оцениваться как 'true' [-Waddress]

В чем смысл вышеупомянутого предупреждения? Почему значение a равно 1 не 0?

  • 5
    int a(); это объявление функции.
  • 2
    en.wikipedia.org/wiki/Most_vexing_parse
Показать ещё 10 комментариев
Теги:
warnings

2 ответа

2
Лучший ответ

int a(); объявляет функцию, а не переменную. Если вы хотите быть нулевой инициализируется переменная, то вам нужен один из a

int a{};  // C++11 or later
int a = int();
int a(0);
int a = 0;

<< не имеет перегрузки, которая может непосредственно принимать функцию; поэтому он ищет подходящую последовательность преобразования для типа, в котором она перегружена, и находит:

int() -> int(*)() -> bool

то есть, используя стандартные преобразования "от функции к указателю" и конверсии "указатель-в-булево". Указатель функции не будет пустым, так как объявленная функция должна существовать и иметь адрес; поэтому логическое значение будет true.

3

Это может выглядеть как определение a как int, но:

int a();

объявляет функцию a без параметров и возвращает int.

Использование:

int a{};

вместо.

std::cout<<a;

вызывает operator<<() с bool который всегда отличен от нуля, отсюда и true.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню