嗨,
我見過operator->()
被鏈接(再使用)其被評估之後,例如:
struct Bar
{
Bar() : m_str("Hello world!") {}
const string* operator->() const { return &m_str; }
string m_str;
};
struct Foo
{
const Bar& operator->() const { return m_bar; }
Bar m_bar;
};
int main()
{
Foo f;
cout << f->c_str() << endl;
return 0;
}
工作得很好,這需要三個operator->()
進行評估 - Foo::operator->()
,Bar::operator->()
和正常的指針分辨率。
但它不會在指針中間工作 - 如果Foo::operator->()
返回指向Bar而不是引用的指針,它不會編譯。例如,auto_ptr<auto_ptr<string>>
也是如此。
是否特定於非超載operator->()
因此它只應用一次而不會導致鏈接? 是否有可能在不使用(*ptr2)-> ...
的情況下使代碼在工作之下?
int main()
{
string s = "Hello world";
auto_ptr<string> ptr1(&s);
auto_ptr<auto_ptr<string> > ptr2(&ptr1);
cout << ptr1->c_str() << endl; // fine
cout << ptr2->c_str() << endl; // breaks compilation
}
謝謝!
重載[重載運算符 - >](http://stackoverflow.com/questions/4896238/overloading-operator)[AndreyT的答案解釋了`operator->`的行爲以及如何發生「鏈接」。] – 2011-02-07 15:48:36
@詹姆斯我贊成保持開放,因爲問題的措辭是不同的。它可以幫助其他人找到答案。 – 2011-02-07 15:52:49