shared_ptr的引用仍然是指针吗?

时间:2017-03-22 16:20:14

标签: c++ reference shared-ptr

最近我在工作中对shared_ptr的引用有疑问。这是代码。

for (const auto & aRef : aVec) {
    THROW_RUNTIME_IFNULLPTR(aRef);
    // do sth
}

这是我同事的代码。在我看来,aRef是一个永远不会为空的引用。虽然我被告知(由auto &aRef仍然是一个指针,所以它可能是空的。参考只是不增加计数器。我对此非常困惑。

然而,它应该像

for (const auto & aRef : aVec) {
    // THROW_RUNTIME_IFNULLPTR(aRef);
    if ( aRef ) {
        aRef->getX();
    }
    // do sth
} 

我错了吗?我不认为aRef是指针。

3 个答案:

答案 0 :(得分:8)

  

在我看来,aRef是一个永远不会为空的引用。

是和否。引用可以是它引用的对象可以是的所有内容。如果该对象是intstd::stringstd::vector<double>,那么当然它不能为空(或者nullptr,确切地说。)

但是,如果该对象是指针,例如int*void*MyClass*,那么它可以是nullptr因为指针可以是nullptr

现在,在你的情况下,被引用的对象是std::shared_ptr。它在技术上不能nullptr,但它可以代表 nullptr处于get()返回nullptr的状态。

  

虽然我被告知(auto &} aRef仍然是一个指针,所以它可能是空的。

更确切地说:aRef仍然是std::shared_ptr,因此它仍然代表nullptr

答案 1 :(得分:5)

std::shared_ptrexplicit operator bool(),所以在此代码中

if ( aRef )

将调用该运算符,如果底层指针不为null,则返回true。

答案 2 :(得分:2)

aRef是一个参考。它是对象的别名。

指针是一个单独的对象,可能指向另一个对象。

在这种情况下,aRef是对std::shared_ptr<Something>类型的对象的引用。

代码大致相当于:

auto first = aVec.begin();
auto last = aVec.end();
for( ; first != last ; ++first) {
    std::shared_ptr<Something> const& aRef = *first;
    if (aRef.get() != nullptr) {
        aRef->getX();
    }
    else {
        // handle the case where aRef is not pointing at an object
    }
}