Ваш код плохо сформирован относительно C ++ 03. Вы можете не когда-либо создать постоянный (или изменчивый) квалифицированный тип функции. Всякий раз, когда вы делаете, ваша программа становится плохо сформированной.
Это правило было изменено для C ++ 1x, чтобы компилятор игнорировал const
/ volatile
. Компиляторы C ++ обычно уже реализуют это правило даже в режиме C ++ 03. Таким образом, следующие два будут определять одну и ту же функцию дважды, что приведет к ошибке компиляции.
typedef void Ft();
void f(Ft const*) { }
void f(Ft *) { } // another definition!
Вот доказательство моей претензии. C ++ 03, 8.3.5/1
cv-qualifier-seq должен быть только частью типа функции для нестатической функции-члена, типа функции, к которому относится указатель на член, или типа функции верхнего уровня объявления функции typedef. Эффект cv-qualifier-seq в деклараторе функции - это не то же самое, что добавление cv-qualification поверх типа функции, то есть он не создает cv-квалифицированный тип функции. Фактически, если в любое время при определении типа формируется квалифицированный по типу cv тип функции, программа является некорректной.
Вот этот текст для C ++ 1x, 8.3.5/7
n2914:
cv-qualifer-seq должен быть только частью типа функции для нестатической функции-члена, типа функции, к которому относится указатель на член, или типа функции верхнего уровня объявления функции typedef. Влияние cv-квалификатора-seq в деклараторе функции - это не то же самое, что добавить cv-квалификацию поверх типа функции. В последнем случае cv-квалификаторы игнорируются.
Выше сказано, что приведенное ниже является допустимым, и создает тип функции для функции, которая может объявить функцию-член const.
typedef void Ft() const;
struct X { Ft cMemFn; };
void X::cMemFn() const { }