class同居的c++复制(引用)构造函数和移动构造函数

c++ copy (reference) constructor and move constructor of class cohabitation

此处显示意图的代码:

template<typename T>
class B 
{
  public:
  // this should indeed set t_ as a reference to t
  B(T& t):t_(t){}
  // this should instead set t_ as a copy of t
  B(T&& t):t_(t){}
  T& t_; // maybe type should be something else ?
};

A a;
B b1(a); // fine
B b2(A()); // problem

可以吗?

我假设您希望 b1b2 具有相同的类型,B<A>

如果是这样,您可以ab使用std::shared_ptr:

std::shared_ptr<T> ptr;

B(T &src) : ptr(std::shared_ptr<T>(), &src) {}
B(T &&src) : ptr(std::make_shared<T>(srd::move(src))) {}

如果你不喜欢这个解决方案,你可以这样做:

std::optional<T> storage;
T &ref;

B(T &src) : ref(src) {}
B(T &&src) : storage(std::move(src)), ref(*storage) {}

请注意,在这种情况下,您需要自定义 copy/move 构造函数,否则您的 class 将不符合 the rule of three.

您也可以在这里使用 std::unique_ptr 代替 std::optional

在 C++17 中,使用 Class Template Argument Deduction (CTAD),你可以这样做:

template<typename T>
class B 
{
public:
  B(T&& t):t_(t){}
  T t_;
};

template <typename T> B(T&) -> B<T&>;
template <typename T> B(T&&) -> B<T>;

Demo