Рассмотрим следующие классы 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 являлся как ссылочным типом, так и типом значения.