Эту ошибку лучше всего понять, когда вы понимаете, что обычно вы не пишете типы функций, не называя по крайней мере функции, но это немного более распространено для указателей функций.
Например, int (*fooPtr)()
называет указатель. Если вы опустите имя, у вас есть int (*)()
. Теперь переход от указателя на тип функции даст вам int ()()
.
Здесь нет реального стандарта, потому что ISO C ++ не определяет канонические имена для всех типов. Например, const volatile int
соответствует типу volatile const int
, и ни одна форма не является канонической.