std::add_pointer 非静态成员函数的实现

std::add_pointer implementation for non-static member functions

提问人:Vinod 提问时间:8/20/2019 最后编辑:Ulrich EckhardtVinod 更新时间:9/14/2019 访问量:268

问:

这个问题是关于 std::add_pointer 实现的问题的后续

std::add_pointer

有以下参考:

否则(如果 T 是 cv 或 ref 限定的函数类型),则提供 成员 typedef 类型,即 T 类型。

根据阅读非静态成员函数:const-、volatile- 和 ref-qualified 成员函数,我的理解是 a 对于具有给定和/或限定的非静态成员函数,cvref

a) 函数的限定也适用于指针,在函数的范围内cvthis

b) 函数的限定不适用于函数范围内的指针refthis

既然如此,为什么在非静态成员函数的情况下不能为成员提供或限定呢?std::add_pointertypedeftypeT*cvref

C++ 语言律师 std

评论

3赞 cpplearner 8/20/2019
根本没有指向 cv 或 ref 限定函数类型的函数指针。这种类型根本不存在。

答:

1赞 L. F. 9/14/2019 #1

根据 [dcl.ptr]/4

注意:形成指向引用类型的指针格式不正确;看 [dcl.ref]. 如果 函数类型具有 cv-qualifiersref-qualifier;看 [dcl.fct]. 由于无法获取位域的地址,因此 指针永远不能指向位域。— 完 注意 ]

您想象的指向 cv-qualified-function 类型的指针实际上不存在。因此,不能产生这样的类型:)std::add_pointer

0赞 n. m. could be an AI 9/14/2019 #2

无法形成非静态成员函数类型。这样的事情是不存在的。

struct T {
   int func() const;
};

func没有类型。您永远不能将其单独用作表达式。

using mf = int (T::*)() const; 
mf myfunc = &T::func;

mf是指向成员函数类型的指针。它不是函数类型;指向非静态成员(包括成员函数)的指针是数据,而不是函数。

成员函数的 cv 或 ref 限定不会确定不存在的函数类型,而是确定隐式“this”参数的类型。

您引用的段落仅适用于非成员或静态成员函数。