В дополнение к ответу GMan здесь (x
- это определение функции), почему 1
.
Причина вывода 1
состоит в том, что в месте вызова std::cout << x
функция превращается в указатель на функцию (язык не позволяет передавать функции в качестве аргументов другим функциям, поэтому как и для массивов, выполняется неявное преобразование в указатель на ). Теперь нет перегрузки для ostream
, который принимает указатель на функцию, и компилятор пытается выбрать преобразование в любую из доступных перегрузок. В этот момент он обнаруживает, что последовательность преобразования best соответствует bool
, и печатает 1
(указатель не равен 0).
Вы можете проверить это, изменив поведение, вы можете использовать std::cout << std::boolalpha << x
, и это напечатает true
вместо 1
. Кроме того, интересно отметить, что VS правильно с этим, так как выражение std::cout << x
требует принятия адреса x
, тогда функция используется и программа плохо сформирована, если есть нет определения для этой функции. Вы можете снова проверить это, предоставив определение:
int f() {}
int main() {
int x(int()); // 1
x( &f ); // 2
}
int x( int(*)() ) { // 3
std::cout << "In x" << std::endl;
}
Где я вручную выполнил преобразование из function
в pointer-to-function
в определении x
(1) и вызов с аргументом f
(2) - обратите внимание, что объявление в 1 и определения в 3 имеют одинаковую подпись, и что &
в x( &f )
будет выполняться компилятором, если вы этого не сделаете.