Нет ли разницы между адресом функции и адресом функции?
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
и гниение не происходит.