Я получаю удовольствие от изучения необычных уголков C ++. Узнав о реальных типах функций, а не об указателях функций из этого вопроса , я попытался возиться с типизацией функций и придумал такой странный случай:
typedef int Func(int);
int Foo(int x) { return 1; }
int main()
{
const Func*& f = &Foo;
return 0;
}
Поскольку &Foo
является значением типа Func*
, я решил, что смогу поместить его в константную ссылку, но я получаю эту ошибку из g ++ 4.6:
funcTypes.cpp: In function ‘int main()’:
funcTypes.cpp:7:23: error: invalid initialization of non-const reference of type ‘int (*&)(int)’ from an rvalue of type ‘int (*)(int)’
Но f
- это const! Мне стало очевидно, что применение const к функции (или ссылка / ссылка на указатель и т. Д.) Просто игнорируется; этот код компилируется просто отлично:
template <typename A, typename B>
struct SameType;
template <typename A>
struct SameType<A, A> { };
typedef int Func(int);
int main()
{
SameType<const Func, Func>();
return 0;
}
Полагаю, это то, как boost использует их черту типа is_function
, но мой вопрос - почему C ++ позволяет это игнорировать, а не запрещать?
РЕДАКТИРОВАТЬ: теперь я понимаю, что в первом примере f
не является const и что const FuncPtr& f = &Foo
работает. Однако это был просто фон, реальный вопрос - тот, что выше.