Механизм function-to-pointer conversions и отличие имени функции func от &func?
В голове полная каша в этих вопросах, проясните пожалуйста все по полочкам..
Почему это утверждение:
void func(){};
static_assert(is_same<void(*)(), decltype(func)>::value);
дает ошибку? Почему func тут не распадается до указателя на себя? Если я правильно понимаю, funс будет тем же самым что и &funс, но разница в том, что &funс сразу возвращает указатель на функцию, а funс (нативно) возвращает тип функции (или ссылку?), но автоматически преобразуется к указателю на функцию и становится тем же, что и &funс, верно? А в decltype этого преобразования (function-to-pointer conversions) не происходит, правильно?
В общем, когда мы используем имя функции в качестве выражения, оно распадается до указателя на само себя, но что это означает - что создается отдельная переменная-указатель, которая содержит адрес функции? Но что за адрес она может содержать, если функция это не объект?
А &func возвращает сразу указатель на функцию без каких-либо дополнительных преобразований? И опять-таки, что в этом контексте значит указатель - отдельная переменная в памяти? Или адрес в памяти? Но почему тогда называется указатель?