Что делает компилятор с параметрами против параметров?
У меня есть не важный вопрос о компиляторах для 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, обратите внимание на все предупреждающие сообщения, которые выдает компилятор.