提问人:Vinod 提问时间:8/20/2019 最后编辑:Ulrich EckhardtVinod 更新时间:9/14/2019 访问量:268
std::add_pointer 非静态成员函数的实现
std::add_pointer implementation for non-static member functions
问:
这个问题是关于 std::add_pointer 实现的问题的后续
在 std::add_pointer 下
有以下参考:
否则(如果 T 是 cv 或 ref 限定的函数类型),则提供 成员 typedef 类型,即 T 类型。
根据阅读非静态成员函数:const-、volatile- 和 ref-qualified 成员函数,我的理解是 a 对于具有给定和/或限定的非静态成员函数,cv
ref
a) 函数的限定也适用于指针,在函数的范围内cv
this
b) 函数的限定不适用于函数范围内的指针ref
this
既然如此,为什么在非静态成员函数的情况下不能为成员提供或限定呢?std::add_pointer
typedef
type
T*
cv
ref
答:
根据 [dcl.ptr]/4:
[ 注意:形成指向引用类型的指针格式不正确;看 [dcl.ref]. 如果 函数类型具有 cv-qualifiers 或 ref-qualifier;看 [dcl.fct]. 由于无法获取位域的地址,因此 指针永远不能指向位域。— 完 注意 ]
您想象的指向 cv-qualified-function 类型的指针实际上不存在。因此,不能产生这样的类型:)std::add_pointer
无法形成非静态成员函数类型。这样的事情是不存在的。
struct T {
int func() const;
};
func
没有类型。您永远不能将其单独用作表达式。
using mf = int (T::*)() const;
mf myfunc = &T::func;
mf
是指向成员函数类型的指针。它不是函数类型;指向非静态成员(包括成员函数)的指针是数据,而不是函数。
成员函数的 cv 或 ref 限定不会确定不存在的函数类型,而是确定隐式“this”参数的类型。
您引用的段落仅适用于非成员或静态成员函数。
评论