const 成员函数和 typedef,C++

Posted

技术标签:

【中文标题】const 成员函数和 typedef,C++【英文标题】:Const member function and typedef, C++ 【发布时间】:2016-12-14 01:51:12 【问题描述】:

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

typedef int FC() const;
typedef int F();

struct A

   FC fc;         // fine, we have 'int fc() const'
   const F f;    // not fine, 'const' is ignored, so we have 'int f()'
;

由于const 被忽略,程序编译得很好。为什么const 被忽略的功能?由于我们可以以这种方式形成 const 指针,我唯一能想到的就是“C 遗产”。标准对此有什么说法吗?

【问题讨论】:

int () const 主要是半类型,因为它可能只适用于具有成员函数的类。 它不能是“C 遗产”,因为 C 没有成员函数。 是的,但是在 C 中我们仍然可以有: typedef int F();常量 F f;即使 'int f() const' 可能在语法上不正确。 有趣的问题。为什么它被否决?似乎F 之前的const 完全被忽略了。我通过打印它的类型进行了检查,并期望它至少可能是const int (A::*)()。但是不,它只是 int (A::*)() 是的,因为 'const' 和 'F' 的顺序不是必需的。 【参考方案1】:

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();
;

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

【讨论】:

【参考方案2】:

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

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

meow(purr);

忽略额外的const 允许它工作。

【讨论】:

以上是关于const 成员函数和 typedef,C++的主要内容,如果未能解决你的问题,请参考以下文章

C++特殊成员

c++ const

C++类和对象(this指针6个默认成员函数const成员)

C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解

c++ const修饰成员函数

C++点滴----关于类常成员函数