Нет ли разницы между адресом функции и адресом функции?

void f()
{}

void test()
{
    auto fn_1 = f;
    auto fn_2 = &f;

    assert(fn_1 == fn_2); // OK

    fn_1();      // OK
    fn_2();      // OK
    (*fn_1)();   // OK
    (*fn_2)();   // OK
    (**fn_1)();  // OK
    (**fn_2)();  // OK
    (***fn_1)(); // OK
    (***fn_2)(); // OK
}

Определены ли эти поведения в стандарте C++?

2 ответа

Да, амперсанд необязателен, они дают одинаковый результат.

Значение l типа функции T может быть преобразовано в значение типа "указатель на T". Результатом является указатель на функцию.

Я просто пойду вперед и скажу, что если вы используете C++11, вы должны использовать std::function в любом случае, это намного легче понять и использовать.

Проблема в том, что функция превращается в указатель на функцию. Типы обеих переменных fn_1 а также fn_2 являются void (*)()т.е. указатель на функцию, не принимающую аргументов и возвращающую void". В случае fn_1, функция f распадается в указатель на функцию, а в случае fn_2Вы явно назначаете указатель на функцию fn_2и гниение не происходит.

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