[英]confusion about operator overload in C++
我定義了一個類來包裝原始指針,因此可以自動刪除指針。 這是我的代碼
#include <iostream>
class Entity
{
private:
std::string e_name;
public:
Entity():e_name("unknown"){}
void whoami() {
std::cout << e_name;
}
};
class ScopePointer
{
private:
Entity *_e;
public:
ScopePointer(Entity *e) : _e(e) {}
~ScopePointer() { delete _e; }
Entity *operator->() { return _e; }
};
int main(int argc, char *argv[])
{
ScopePointer p(new Entity());
p->whoami();
}
它運作良好,但我很不明白p->whoami();
作品。 我的意思是操作符 -> ScopePointer 中的重載應該像下面一樣工作
p.operator->()->whoami();or p->->whoami();
第一個->
應該返回 Entity* 和下一個->
調用類方法。 為什么只有一個 -> 可以讓它工作?
我希望 C++ 14 標准中的這句話有助於理解運算符的工作原理。
C++ 14 標准(13.5.6 類成員訪問,p #1)
如果 T::operator->() 存在並且運算符被選為最佳匹配函數,則表達式 x->m 被解釋為 (x.operator->())->m 用於類型為 T 的類對象 x通過重載解析機制。
因此,重載運算符實際上是內置運算符-> 的“前綴表達式”,它提供了內置運算符中使用的指針。
我很不明白
p->whoami();
作品
->
運算符的普通規則有一個例外,因此您只需要一個->
。 該語言要求實現遞歸地計算operator->
直到它找到一個指針對象,而不是某個類類型的對象。
類成員訪問運算符函數是一個名為
operator->
的函數,它是一個不帶參數的非靜態成員函數。 對於形式的表達后綴表達式-> 模板選擇id 表達式
運算符函數由重載決議([over.match.oper])選擇,表達式被解釋為
( postfix-expression .
operator->()
) -> 模板opt id-expression
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.