shared_ptr的引用仍然是指针吗?

Fan*_*Fan 3 c++ reference shared-ptr

最近我对我的工作有一个疑问shared_ptr.这是代码.

for (const auto & aRef : aVec) {
    THROW_RUNTIME_IFNULLPTR(aRef);
    // do sth
}
Run Code Online (Sandbox Code Playgroud)

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

但是,应该是这样的

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

我错了吗?我不认为那aRef是一个指针.

Chr*_*ckl 8

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

是的,不是.引用可以是它引用的对象可以是的所有内容.如果该对象是,例如,a int或a std::string或a std::vector<double>,那么当然它不能为空(或者nullptr,确切地说).

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

现在在你的情况下,被引用的对象是a std::shared_ptr.它在技术上不可能nullptr,但它可以通过处于返回的状态来表示 .nullptrget()nullptr

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

更准确地说:aRef仍然是一个std::shared_ptr,所以它仍有可能代表nullptr.


Ant*_*vin 5

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

if ( aRef )
Run Code Online (Sandbox Code Playgroud)

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