Почему C ++ позволяет, но игнорирует применение констант к типам функций?

Я получаю настоящее удовольствие от изучения необычных уголков 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 действительно работает. Однако это была лишь предыстория, реальный вопрос в том, что выше.

6
задан Community 23 May 2017 в 12:09
поделиться