我有一个vector<unique_ptr<BaseClass>>
,我通过调用vec.push_back(std::make_unique<DerivedClass>())
来添加新项。
如何使用operator bool()
检查nullptr
?
我尝试直接使用vec.back()
,就像这样:
if((!vec.empty() && vec.back())
{
// yay!
}
else
{
//nay!
}
但它总是返回false,无论指针的内容如何。
我有一个vector<unique_ptr<BaseClass>>
,我通过调用vec.push_back(std::make_unique<DerivedClass>())
来添加新项。
如何使用operator bool()
检查nullptr
?
我尝试直接使用vec.back()
,就像这样:
if((!vec.empty() && vec.back())
{
// yay!
}
else
{
//nay!
}
但它总是返回false,无论指针的内容如何。
正如您可以从这里所阅读的那样,如果向量为空,则是未定义行为。如果不是这种情况,则正如您可以从这里所阅读的那样,unique_ptr
具有一个operator bool()
,它检查是否当前由unique_ptr
管理对象
所以,有:
vector.empty();
您可以通过以下代码检查向量是否有元素:
vector<unique_ptr<something>> vec;
vec.push_back(make_unique<something>());
if(vec.front()){ // example
// do something
}
unique_ptr
是否指向一个对象。
PS:如果你总是使用 vec.push_back(std::make_unique<DerivedClass>())
,那么你永远不会有一个持有 nullptr
的 unique_ptr
。
@Berto99的回答提到了调用空std::vector
的UB问题,即调用std::vector::back
。
此外,像@RemyLebeau所说,如果使用std::make_unique
,它将始终返回类型为T
(即BaseClass
)实例的std::unique_ptr
。
我想给你关于你的实际问题添加一些内容。如果你想检查最后一个插入的元素,可以使用std::vector::emplace_back
,它从C++17开始返回对插入元素的引用。
std::vector<std::unique_ptr<BaseClass>> vec;
auto& lastEntry = vec.emplace_back(std::make_unique<BaseClass>());
if (lastEntry) // pointer check
{
// do something with the last entry!
}
std::make_unique()
永远不会返回持有nullptr
的std::unique_ptr
。但是,如果vec
不为空(否则调用back()
将导致未定义行为),则if(vec.back())
可以很好地调用unique_ptr::operator bool
。因此,您遇到的任何问题都在您未展示的代码中。 - Remy Lebeau