const成员函数和typedef,C ++

时间:2016-08-08 10:17:22

标签: c++ const language-lawyer typedef member-functions

假设我们想通过typedef声明const成员函数:

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传承”。标准是否对此有所说明?

2 个答案:

答案 0 :(得分:19)

C ++ 14标准, [dcl.fct] pt。 7:

  

cv-qualifier-seq在函数声明符中的作用与在顶部添加cv-qualification不同   功能类型。在后一种情况下,忽略cv限定符。 [注意:有一个函数类型   cv-qualifier-seq不是cv限定类型;没有cv限定的函数类型。 - 结束说明]

示例:

typedef void F();

struct S {
    const F f; // OK: equivalent to: void f();
};

所以,这是一种正确的行为。

答案 1 :(得分:2)

此更改由CWG 295完成,主要是为了简化通用编程。考虑:

template<class F>
void meow(const F& f) { f(); }
void purr();

meow(purr);

忽略额外的const可以实现此目的。