繁体   English   中英

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

[英]std::add_pointer implementation for non-static member functions

这个问题是A question about the implementation of std::add_pointer的后续

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指针

鉴于此,在具有cvref限定的非静态成员函数的情况下,为什么std::add_pointer不能提供成员typedef type T*

[dcl.ptr]/4

[注意:形成一个指向引用类型的指针是不正确的; 参见 [dcl.ref]。 如果函数类型具有cv-qualifiersref-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM