Функция члена-члена и typedef, С++
Предположим, мы хотим объявить функцию-член-член через typedef
:
typedef int FC() const;
typedef int F();
struct A
{
FC fc; // fine, we have 'int fc() const'
const F fc; // not fine, 'const' is ignored, so we have 'int fc()'
};
Так как const
игнорируется, программа компилируется штрафом. Почему const
игнорируется для функции? Поскольку мы можем формировать указатель const таким образом, единственное, что я могу представить, это "C-наследие". Говорит ли стандарт об этом?
Ответы
Ответ 1
Стандарт С++ 14, [dcl.fct] pt. 7:
Эффект cv-qualifier-seq в деклараторе функции не совпадает с добавлением cv-квалификации сверху типа функции. В последнем случае cv-квалификаторы игнорируются. [Примечание: тип функции, который имеет cv-qualifier-seq не является cv-квалифицированным типом; не существует специальных типов функций cv. - конечная нота]
Пример:
typedef void F();
struct S {
const F f; // OK: equivalent to: void f();
};
Итак, это правильное поведение.
Ответ 2
Это изменение сделано CWG 295, в основном для облегчения создания общего программного обеспечения. Рассмотрим:
template<class F>
void meow(const F& f) { f(); }
void purr();
meow(purr);
Игнорирование дополнительного const
позволяет это работать.