假设我们想通过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传承”。标准是否对此有所说明?
答案 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
可以实现此目的。