指南支持库介绍了谁的目的是在类似not_null<T>
指针的类型上强制执行不变量,特别是在智能指针上。但是,这是一个不起作用的已知问题。not_null<unique_ptr<T>>
据我所知,原因是它unique_ptr<T>
不是可复制构造的,并且not_null<T>
没有从其 T 移动的构造函数。not_null<T>
也不是默认可构造的,因为它会破坏它的不变性。即使我们可以构造not_null<unique_ptr<T>>
,也不可能有意义地到达unique_ptr
内部,因为我们无法复制unique_ptr
和移动它会留下not_null<T>
一个空指针。它看起来像一个完美的陷阱。
我认为我们可以合法地从not_null<T>
特定上下文中的对象移出:就在它超出范围之前。换句话说,离开它应该是销毁前的最后一次访问。这样,具有破坏不变性的对象将不会被程序的其余部分观察到。(仅可观察到not_null
' 自己的代码。)
在以下示例中,假设我们可以从not_null<T>
.
not_null<unique_ptr<int>> f()
{
return make_unique<int>(1);
}
void g(not_null<unique_ptr<int>> p)
{
...
}
void h()
{
auto p = f();
g(make_unique<int>(2));
}
我的假设是否正确,即
not_null<unique_ptr<int>>
从 f() 返回的状态在从它移动后不会泄漏(仅用于示例)?我的假设是否正确,即
not_null<unique_ptr<int>>
传递给 g() 的状态在从它移动后不会泄漏(仅用于示例)?是否可以在禁止 C++14/17 中常见的移动情况的同时允许这种特殊的移动?