[英]std::add_pointer implementation for non-static member functions
这个问题是A question about the implementation of std::add_pointer的后续
有以下参考:
否则(如果 T 是 cv 或 ref 限定的函数类型),则提供成员 typedef 类型,即类型 T。
基于阅读Non-static member functions: const-, volatile-, and ref-qualified member functions ,我的理解是对于具有给定cv
和/或ref
限定的非静态成员函数,
a) 函数的cv
限定也适用于this
指针,在函数范围内
b) 函数的ref
限定不适用于函数范围内的this
指针
鉴于此,在具有cv
或ref
限定的非静态成员函数的情况下,为什么std::add_pointer
不能提供成员typedef
type
T*
?
每[dcl.ptr]/4 :
[注意:形成一个指向引用类型的指针是不正确的; 参见 [dcl.ref]。 如果函数类型具有cv-qualifiers或ref-qualifier ,则形成函数指针类型是病态的; 见[dcl.fct]。 由于无法获取位域的地址,因此指针永远不能指向位域。 —尾注]
您想象的指向 cv 限定函数类型的指针实际上并不存在。 因此, std::add_pointer
不能产生这样的类型:)
不能形成非静态成员函数类型。 这样的事情不存在。
struct T {
int func() const;
};
func
没有类型。 您永远不能将它单独用作表达式。
using mf = int (T::*)() const;
mf myfunc = &T::func;
mf
是指向成员函数类型的指针。 它不是函数类型; 指向非静态成员(包括成员函数)的指针是数据,而不是函数。
成员函数上的 cv 或 ref 限定不限定不存在的函数类型,而是限定隐式“this”参数的类型。
您引用的段落仅适用于非成员或静态成员函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.