箭头间接运算符(operator->)返回值的生存期是多少?

时间:2019-04-26 18:43:51

标签: c++ operator-overloading object-lifetime

正如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 ++标准保证了这种排序。

0 个答案:

没有答案