Я собираюсь предположить, что вы хотите, чтобы 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
здесь.