据我所知大多数运算符重载,与成员访问运营商外->,.*,->*等.
特别是,传递给这些操作符函数的内容以及应返回的内容是什么?
操作员如何运作(例如operator->(...))知道所指的成员是什么?可以知道吗?它甚至需要知道吗?
最后,是否需要考虑常见因素?例如,当重载类似的东西时operator[],通常你需要const和非const版本.成员访问运算符是否需要const和非const版本?
澄清英语中可能的优先歧义:我们正在采取"智能(指向成员的指针)",而不是"(智能指针)成员".
我会将一个指向成员的智能指针定义为带有operator ->* (T* lhs, X rhs)重载的类X.
在他的文章"实现操作符 - >*用于智能指针"中,Scott Meyers只是简单地触及指向成员的智能指针,因为当时(1999)特定问题对于成员的原始指针来说已经足够困难了(旁注:后者优雅地解决了)这里有lambdas ).
无论如何,Scott Meyers写了一个脚注:
在撰写本文草稿后不久,我的一位咨询客户向我展示了一个问题,这个问题通过智能指向成员的方式自然而然地解决了.我也很惊讶.
我试图找到一个这样一个成员的自然智能指针的例子.但是我既不能自己想出任何东西,也没有在线搜索发现我在寻找什么.
你知道任何现实世界"成员智能指针"的例子吗?
编辑:我不是在寻找任何->*过载(如某些EDSL所做的那样).针对具有类似内置语义的语义示例->*,我上面的定义明确要求lhs是一个原始指针.
根据维基百科:
一个对象是第一类的:
有人曾告诉我原始指针不是第一类对象,而像std :: auto_ptr这样的智能指针是.但对我来说,C++中的原始指针(对象或函数)在我看来确实满足上述条件才有资格作为第一类对象.我错过了什么吗?
为什么std :: shared_ptr没有operator->*?
使用可变参数模板看起来很容易.
有关详细信息,请参阅此文章.
编辑:这似乎是一个潜在的重复:关于shared_ptr和指向成员运算符的指针` - >*`和`std :: bind`