操作员>瞬变性和shared_ptr

Operator-> transistency and shared_ptr

本文关键字:shared ptr gt 操作员      更新时间:2023-10-16

我记得在某处读过,但不记得在哪里,操作符->是暂态的。它会用operator->查找对象,直到找到不是指针的东西,然后运行一个普通的操作符。在那。然而,我遇到了一个问题,

考虑以下代码:

#include <boost/shared_ptr.hpp>
#include <vector>
#include <iostream>
struct Foo {
    Foo(int val) : i(val) {}
    typedef boost::shared_ptr<Foo> ptr;
    int i;
};
int main(int argc, char** argv) {
    typedef std::vector<Foo::ptr> FooVec;
    FooVec v;
    for(FooVec::iterator it = v.begin(); it != v.end(); ++it) {
        std::cout <<it->i <<std::endl;
    }
    return 0;
}

我得到这个错误:

ptr.cpp: In function ‘int main(int, char**)’:
ptr.cpp:15:19: error: ‘class boost::shared_ptr<Foo>’ has no member named ‘i’
   std::cout <<it->i <<std::endl;

因为boost::shared_ptr不是指针。我可以用

来解决这个问题
std::cout <<(*it)->i <<std::endl

但我认为这看起来更糟,我试过std::shared_ptr,但也有同样的问题。是否有一个很好的方法来解决这个问题,或者我被困在(*it)->i ?

我记得在某个地方读过,但不记得在哪里了,那个运算符->是短暂的。

在c++中没有。正如您已经发现的那样,您需要双重取消引用。