Подтвердить что ты не робот

Функция члена-члена и 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-наследие". Говорит ли стандарт об этом?

4b9b3361

Ответ 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 позволяет это работать.