Рассмотрим следующие классы foo1
и foo2
template <typename T>
struct foo1
{
T t_;
foo1(T&& t) :
t_{ std::move(t) }
{
}
};
template <typename T>
struct foo2
{
foo1<T> t_;
foo2(T&& t) :
t_{ std::forward<T>(t) }
{
}
};
Всегда ли конструктор foo1
представляет правильный способ инициализации переменной-члена T
? то есть с помощью std::move
.
Всегда ли конструктор foo2
представляет собой правильный способ инициализировать переменную-член foo1<T>
из-за необходимости пересылки в конструктор foo1? т.е. используя std::forward
.
Обновление
Следующий пример не выполняется для foo1
с помощью std::move
:
template <typename T>
foo1<T> make_foo1(T&& t)
{
return{ std::forward<T>(t) };
}
struct bah {};
int main()
{
bah b;
make_foo1(b); // compiler error as std::move cannot be used on reference
return EXIT_SUCCESS;
}
Это проблема, поскольку я хочу, чтобы T являлся как ссылочным типом, так и типом значения.