有条件地传递成员的所有权



>假设以下草图:

struct C {
(either T or T&) m_t;
C(T& t):
(instantiate m_t as T& m_t(t))
{}
C(T&& t):
(instantiate m_t as T(t))
{}
};

这样C要么拥有或没有t的所有权,这取决于C是如何建造的。这可能吗,可能不用诉诸shared_ptr,因此不得不将所有东西都移到堆里?我正在尝试std::variant,但到目前为止没有成功。

也许是这样的

struct C {
std::optional<T> t_holder;
T& m_t;
C(T& t) : m_t(t) {}
C(T&& t) : t_holder(std::move(t)), m_t(*t_holder) {}
};

还需要一个复制和/或移动构造函数(隐式构造函数不会做正确的事情); 并且必须删除复制/移动赋值运算符,因为我认为它们无法合理实现。挽救分配的一种方法是用std::reference_wrapper<T>替换T&;它的行为几乎像一个引用,但可以反弹。

相关内容

  • 没有找到相关文章

最新更新