Как оценивается идентификатор функции без оператора вызова?

В C++, идентификатор функции без оператора вызова оценивается либо как указатель на функцию, либо как имя функции.

Если идентификатор функции используется без оператора вызова, то он рассматривается как указатель на функцию. При этом синтаксис для объявления указателя на функцию выглядит следующим образом:

тип_возвращаемого_значения (*имя_переменной)(список_параметров);

Пример:

int sum(int a, int b) {
    return a + b;
}

int main() {
    int (*ptr)(int, int); // объявление указателя на функцию
    ptr = sum; // присваивание указателю значения функции sum

    int result = ptr(10, 5); // вызов функции через указатель
    std::cout << "Result: " << result << std::endl; // вывод результата

    return 0;
}

В этом примере ptr является указателем на функцию sum, и мы можем вызвать функцию через этот указатель.

Если идентификатор функции используется без оператора вызова в контексте, который не требует указателя на функцию (например, при передаче функции в качестве аргумента другой функции), то идентификатор рассматривается как имя функции. В этом случае адрес функции автоматически преобразуется в указатель на функцию.
Пример:

void printHello() {
    std::cout << "Hello, World!" << std::endl;
}

void executeFunction(void (*func)()) { // функция, принимающая указатель на функцию в качестве аргумента
    func(); // вызов переданной функции
}

int main() {
    executeFunction(printHello); // передача функции в качестве аргумента

    return 0;
}

В этом примере функция printHello передается в качестве аргумента функции executeFunction без указателя. При вызове executeFunction(printHello) имя функции автоматически преобразуется в указатель на функцию.

Таким образом, идентификатор функции без оператора вызова в C++ может быть рассмотрен как указатель на функцию или как имя функции, в зависимости от контекста использования.