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

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

这是我同事的密码。在我看来,aRef是一个永远不能为null的引用。虽然我被auto &告知,aRef仍然是一个指针,所以它可能为null。引用只是不增加计数器。我对此很困惑。

但是,它应该像
for (const auto & aRef : aVec) {
    // THROW_RUNTIME_IFNULLPTR(aRef);
    if ( aRef ) {
        aRef->getX();
    }
    // do sth
}

我对此有错吗?我不认为aRef是一个指针。

最佳答案



是的,没有。引用可以是它所引用的对象可以是的所有事物。例如,如果该对象是intstd::stringstd::vector<double>,那么它当然不能为null(确切地说是nullptr)。

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

现在,在您的情况下,要引用的对象是std::shared_ptr。从技术上讲,它不能是nullptr,但是可以通过处于nullptr返回get()的状态来表示nullptr



更准确地说:aRef仍然是std::shared_ptr,因此它可能仍表示nullptr

08-25 06:01