1

指南支持库介绍了谁的目的是在类似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));
}
  1. 我的假设是否正确,即not_null<unique_ptr<int>>从 f() 返回的状态在从它移动后不会泄漏(仅用于示例)?

  2. 我的假设是否正确,即not_null<unique_ptr<int>>传递给 g() 的状态在从它移动后不会泄漏(仅用于示例)?

  3. 是否可以在禁止 C++14/17 中常见的移动情况的同时允许这种特殊的移动?

4

1 回答 1

0

1&2:忽略省略会使问题在任何值得使用的编译器上没有实际意义的事实,是的。unique_ptr 也忽略了不能“泄漏”的事实。

3:没有。

这一直是 ISO C++ 提案邮件列表中一些争论的主题。一般概念是“破坏性移动”的概念,其中从对象移动并破坏它的行为在同一个调用中执行。但这必须是语言功能;在 C++14 中没有办法判断是否正在调用移动构造函数/赋值,这样给定的对象肯定会被销毁。

于 2016-02-15T23:37:16.543 回答