В связанном вопросе он сказал, что нет такой вещи, как указатель на не-членную функцию const. Кроме того, в С++ 11 8.3.5/6 говорится
Эффект cv-qualifier-seq в объявлении функции не совпадает с добавлением cv-qualification поверх типа функции. В последнем случае cv-квалификаторы игнорируются. [Примечание: тип функции, имеющий cv-qualifier-seq, не является cv-квалифицированным типом; нет типов функций с квалификацией cv. -end note]
Если я правильно понимаю, это означает, что нет такой вещи, как функция, не являющаяся членом-константой. (Хотя такие функции не являются константами, они не могут быть изменены согласно 3.10/6). В частности, указатели на функцию const не имеют смысла.
Однако, похоже, что некоторые компиляторы действительно создают указатели на функцию const в контекстах вывода типов. Например, рассмотрите код:
#include <iostream>
void f() {}
template <typename T> void g( T*) { std::cout << "non const" << std::endl; }
template <typename T> void g(const T*) { std::cout << "const " << std::endl; }
int main() {
g(f);
}
При компиляции с GCC и Intel код выводит "non const", как я ожидал бы из приведенной выше цитаты. Тем не менее, вывод "const" при компиляции с Clang и Visual Studio.
Правильно ли моя интерпретация?
Update:
Следуя комментариям, я пытаюсь уточнить, что я не говорит о функциях const member. Меня интересуют функции, отличные от членов (но те же аргументы, вероятно, применимы и к нестационарным функциям-членам). Я также изменил название вопроса, чтобы уточнить его.
В соответствии с упомянутым выше разрешением g(f)
приведенная ниже строка является ilegal для GCC и Intel, но не для Clang и Visual Studio
const auto* ptr = &f;
Обновление 2:
Я согласен с интерпретацией Энди Проула и выбрал его ответ. Однако после этого мне стало известно, что этот вопрос является CWG открытой проблемой.