【发布时间】:2017-10-18 22:32:20
【问题描述】:
我正在更新一些 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 没有返回值,因此无法将其直接转换为:
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() );
}
但这会给库函数添加混乱的双重调用,理想情况下我想避免这种情况。
【问题讨论】:
-
如果你使用的是 C++17,它允许:
while ( obj.reset( LIBRARY_CALL() ); obj ) -
@aschepler:现在怎么办?
-
C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT你是哪个delete?这很可疑。 -
可能我把这个例子简化得太多了——实际上,unique_ptr 是用一个自定义删除器定义的,它调用了库的清理函数。
-
@KerrekSB open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0305r1.html,2016 年 6 月接受。
标签: c++ c++11 unique-ptr