c++ - per - seo header tags




Разница между типами «веселья» и «веселья»? (2)

Когда вы используете имя функции в качестве выражения, оно распадается на указатель на себя. Так fun будет так же, как &fun .

Что касается typeid вещи, из typeid :

Преобразования Lvalue-to-rvalue, array-to-pointer или function-to-pointer не выполняются.

[Акцент мой]

Действительно ли выражения fun и &fun имеют один и тот же тип или нет?

Рассмотрим следующий код:

template <typename Check, typename T>
void check(T)
{
    static_assert(is_same<Check, T>::value);
}

void fun()
{}

check<void(*)()>(fun);
check<void(*)()>(&fun);

cout << typeid(fun).name() << endl;
cout << typeid(&fun).name() << endl;

Оба утверждения преуспевают, что предполагает, что оба выражения имеют один и тот же тип. Однако typeid s возвращает разные результаты:

FvvE
PFvvE

Почему это?


Оба утверждения преуспевают, потому что они применяются к типу T выведенному из аргумента функции. В обоих случаях он будет выводиться как указатель на функцию, потому что функции распадаются на указатель на функцию. Однако, если вы переписываете утверждения для непосредственного приема типов, то сначала один не будет работать:

static_assert(is_same<void(*)(), decltype(fun)>::value);
static_assert(is_same<void(*)(), decltype(&fun)>::value);

онлайн-компилятор





function-pointers