在条件或循环中分配智能指针
Assign smart pointer in condition or loop
我正在更新一些 C++11 之前的代码以使用 C++11 unique_ptrs。
我不确定如何处理的一件事是当旧代码使用指针赋值作为条件时。例如
Object* obj;
while ( obj = C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() )
{
// do something with obj
delete obj;
}
鉴于 std::unique_ptr::reset 没有 return 值,无法将其直接转换为:
std::unique_ptr< Object > obj;
while ( obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() ) )
{
// do something with obj
}
那么,升级此代码以使用 unique_ptrs 的最简洁方法是什么?我能想到的最好的是:
std::unique_ptr< Object > obj;
obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() );
while ( obj )
{
// do something with obj
obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() );
}
但这增加了对库函数的混乱的双重调用,理想情况下我想避免这种情况。
怎么样:
while ( auto obj = std::unique_ptr<Object>( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() ) )
{
// do something with obj
}
如果你想让obj
在循环外保持存活,你可以使用逗号运算符:
std::unique_ptr< Object > obj;
while ( obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() ), obj )
{
// do something with obj
}
我正在更新一些 C++11 之前的代码以使用 C++11 unique_ptrs。
我不确定如何处理的一件事是当旧代码使用指针赋值作为条件时。例如
Object* obj;
while ( obj = C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() )
{
// do something with obj
delete obj;
}
鉴于 std::unique_ptr::reset 没有 return 值,无法将其直接转换为:
std::unique_ptr< Object > obj;
while ( obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() ) )
{
// do something with obj
}
那么,升级此代码以使用 unique_ptrs 的最简洁方法是什么?我能想到的最好的是:
std::unique_ptr< Object > obj;
obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() );
while ( obj )
{
// do something with obj
obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() );
}
但这增加了对库函数的混乱的双重调用,理想情况下我想避免这种情况。
怎么样:
while ( auto obj = std::unique_ptr<Object>( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() ) )
{
// do something with obj
}
如果你想让obj
在循环外保持存活,你可以使用逗号运算符:
std::unique_ptr< Object > obj;
while ( obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() ), obj )
{
// do something with obj
}