Как объявить константу ссылки на тип функции

#include <iostream>
#include <type_traits>

void func()
{

}

int main()
{
  using T = const decltype(func) &;
  using T2 = void (&)();
  std::cout << std::boolalpha << std::is_same_v<T, T2> << std::endl;
}

Как вы объявляете const reference на тип функции? Вышеприведенное утверждение выводит true поэтому я предполагаю, что const в T каким-то образом игнорируется. Возможно ли вообще объявить const reference на тип функции?

Ответ 1

[dcl.fct] p7:

Эффект cv-qualifier-seq в объявлении функции не совпадает с добавлением cv-квалификации поверх типа функции. В последнем случае cv-квалификаторы игнорируются.

Таким образом, вы можете ссылаться только на функцию, но не на const& поскольку const на тип функции игнорируется, как указано выше.

Ответ 2

Прежде всего, все ссылки являются постоянными. Как только ссылка была инициализирована и привязана к объекту, она не может быть привязана к другому объекту. Ссылка постоянна.

Когда мы говорим о "константной ссылке", это на самом деле означает ссылку на объект const.

Возможно ли вообще объявить константную ссылку на тип функции?

Что означает, что свободная функция будет const? Ничего такого. Только нестатические функции-члены могут быть const. Нет, нельзя ссылаться на постоянную функцию. Еще лучше, что конструктор const не игнорируется компилятором.