正如cppreference.com所指出的那样,箭头操作符的正常重载通常会返回普通指针,而不必这样做:
运算符->的重载必须返回原始指针,或者返回对象(按引用或按值),而运算符->的对象又被重载。
运算符按值返回对象时,该对象的生存期是多少?
天真的,我可以想象它有两种不同的工作方式。返回的对象可以保留整个生命,直到语句完成为止,或者在调用后续的operator->
之后立即“丢弃”返回的临时对象。
例如:
class A {
class A_sub {
A_sub(...);
int foo();
}
std::unique_ptr< A_sub > operator->() {
return std::make_unique< A_sub >(...);
}
}
int main() {
A a;
int val = A->foo();
return val;
}
何时允许调用A_sub的析构函数?是在调用foo()之前,还是将返回的unique_ptr生存期保留到foo()完成之前? (这是否取决于深入的挖掘行为?)
在我看来,“显而易见”的答案是所有operator->
返回值都将保留到语句的最终完成(由于上述生命周期问题),但我不确定是否C ++标准保证了这种排序。