Я получаю настоящее удовольствие от изучения необычных уголков C ++.Узнав о реальных типах функций, а не об указателях функций из этого вопроса , я попытался возиться с набором функций и придумал этот странный случай:
typedef int Func(int);
int Foo(int x) { return 1; }
int main()
{
const Func*& f = &Foo;
return 0;
}
Поскольку & Foo
является rvalue типа 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! Мне стало очевидно, что применение константы к функции (или ссылка / ссылка на указатель и т. Д.) Просто игнорируется; этот код компилируется просто отлично:
template
struct SameType;
template
struct SameType { };
typedef int Func(int);
int main()
{
SameType();
return 0;
}
Я предполагаю, что именно так boost реализует их черту типа is_function
, но мой вопрос - почему C ++ допускает это, игнорируя, а не запрещая?
РЕДАКТИРОВАТЬ: Теперь я понимаю, что в первом примере f
не является const и что const FuncPtr & f = & Foo
действительно работает. Однако это была лишь предыстория, реальный вопрос в том, что выше.