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是一个指针.
在我看来,
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.
std::shared_ptr有explicit operator bool(),所以在这个代码中
if ( aRef )
Run Code Online (Sandbox Code Playgroud)
将调用该运算符,如果底层指针不为null,则返回true.