конструктор копирования (ссылки) c ++ и конструктор перемещения сожительства класса - PullRequest
0 голосов
/ 06 марта 2020

Здесь код, показывающий намерение:

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

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

В C ++ 17 с Удержание аргумента шаблона класса (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>;

Демонстрация

2 голосов
/ 07 марта 2020

Я собираюсь предположить, что вы хотите, чтобы b1 и b2 имели одинаковый тип, 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) {}

Обратите внимание, что в этом случае вам нужно пользовательское копирование / перемещение конструкторы, иначе ваш класс не будет соответствовать правилу трех .

Вы также можете использовать std::unique_ptr вместо std::optional здесь.

...