>假设以下草图:
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&
;它的行为几乎像一个引用,但可以反弹。