我定義了一個類來包裝原始指標,因此可以自動洗掉指標。這是我的代碼
#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* 和下一個->呼叫類方法。為什么只有一個 -> 可以讓它作業?
uj5u.com熱心網友回復:
我希望 C 14 標準中的這句話有助于理解運算子的作業原理。
C 14 標準(13.5.6 類成員訪問,p #1)
如果 T::operator->() 存在并且運算子被選為最佳匹配函式,則運算式 x->m 被解釋為 (x.operator->())->m 用于型別為 T 的類物件 x通過多載決議機制。
因此,多載運算子實際上是內置運算子-> 的“前綴運算式”,它提供了內置運算子中使用的指標。
uj5u.com熱心網友回復:
我完全不明白是如何
p->whoami();作業的
運算子 for 的普通規則有一個例外->,因此您只需要一個->。該語言要求實作遞回求值,operator->直到找到一個指標物件,而不是某個型別別的物件。
從 [over.ref]
一類成員訪問運算子函式是一個命名函式
operator->是一個非靜態成員函式采取任何引數。對于形式的表達后綴運算式-> 模板選擇id 運算式
運算子函式由多載決議([over.match.oper])選擇,運算式被解釋為
( postfix-expression .
operator->()) -> 模板opt id-expression
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344545.html
下一篇:對C 中的char*感到困惑
