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++类和对象(this指针6个默认成员函数const成员)