最近我在工作中对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
是指针。
答案 0 :(得分:8)
在我看来,
aRef
是一个永远不会为空的引用。
是和否。引用可以是它引用的对象可以是的所有内容。如果该对象是int
或std::string
或std::vector<double>
,那么当然它不能为空(或者nullptr
,确切地说。)
但是,如果该对象是指针,例如int*
,void*
或MyClass*
,那么它可以是nullptr
因为指针可以是nullptr
。
现在,在你的情况下,被引用的对象是std::shared_ptr
。它在技术上不能nullptr
,但它可以代表 nullptr
处于get()
返回nullptr
的状态。
虽然我被告知(
auto &
}aRef
仍然是一个指针,所以它可能是空的。
更确切地说:aRef
仍然是std::shared_ptr
,因此它仍然代表nullptr
。
答案 1 :(得分:5)
答案 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
}
}