是为已从中移动()的unique_ptr定义的“unique_ptr::operator bool()”
Is `unique_ptr::operator bool()` defined for a unique_ptr that has been move()d from?
据我所知,从标准库对象移动后,该对象处于有效但未定义的状态。但在unique_ptr
的情况下,它到底有多不定义?从经验上讲,下面的代码似乎是有效的,也就是说,在我从p1
移动之后,"if ( p1 )
"的求值结果为false。从直觉上看,这似乎是正确的行为。但我能相信这一点吗?
#include <memory>
#include <iostream>
int main( int argc, char* argv[] )
{
using namespace std;
unique_ptr<int> p1 {make_unique<int>(1)};
unique_ptr<int> p2;
if ( p1 )
cout << "p1 owns an object" << endl;
if ( p2 )
cout << "p2 owns an object" << endl;
p2 = move(p1);
// Is the following test valid, now that p1 has been moved from?
if ( p1 )
cout << "p1 owns an object" << endl;
if ( p2 )
cout << "p2 owns an object" << endl;
}
输出:
p1 owns an object
p2 owns an object
unique_ptr
的规范明确指出,移动操作对此类指针的影响是所有权从右侧指针转移到左侧指针(20.8.1/16用于移动构造函数,20.8.1.2.3/2用于赋值)。所有权转让的概念在标准(20.8.1/4)中有明确定义,它说在这种转让之后,右手边变成nullptr。
这意味着从unique_ptr
移动的状态或不仅仅是有效的,它是定义的。
我能相信这个吗?
是的,你可以。在std::unique_ptr
上移动意味着从它转移所有权,然后operator bool
肯定会返回false
,因为它不拥有任何对象。
相关文章:
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误