Что делает компилятор с параметрами против параметров?

У меня есть не важный вопрос о компиляторах для C++. Следующий код выводит

1
2
3

и я не могу понять, почему. Какая разница, если объявить его с пустыми параметрами вообще без скобок?

#include <iostream>
using namespace std;

int main()
{
    int x;
    cout << x << endl;

    int y();
    cout << y << endl;

    int z(2);
    cout << z << endl;

    return 0;
}

Компилятор g++.

1 ответ

1-й, x по умолчанию инициализируется неопределенным значением, затем cout << x ведет к неопределенному поведению, значит все возможно.

Инициализация по умолчанию для неклассовых переменных с автоматическим и динамическим сроком хранения создает объекты с неопределенными значениями

2-й, int y(); объявляет функцию с именем y, который не имеет аргумента и возвращает int, За cout << y, y будет распадаться на указатель функции, который может конвертировать в bool неявно и тогда вы получите 1 (т.е. true, Ты можешь использовать std::boolalpha лайк std::cout << std::boolalpha << y чтобы получить выход true).

3-й, z напрямую инициализируется значением 2, затем cout << z ты получишь 2,

Пример LIVE с clang, обратите внимание на все предупреждающие сообщения, которые выдает компилятор.

Другие вопросы по тегам