最近,我在工作中对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
是一个指针。 最佳答案
是的,没有。引用可以是它所引用的对象可以是的所有事物。例如,如果该对象是int
或std::string
或std::vector<double>
,那么它当然不能为null(确切地说是nullptr
)。
但是,如果该对象是指针,例如int*
或void*
或MyClass*
,则它可以是nullptr
,因为指针可以是nullptr
。
现在,在您的情况下,要引用的对象是std::shared_ptr
。从技术上讲,它不能是nullptr
,但是可以通过处于nullptr
返回get()
的状态来表示nullptr
。
更准确地说:aRef
仍然是std::shared_ptr
,因此它可能仍表示nullptr
。