Конструктор структуры шаблона со ссылочным параметром
У меня есть структура шаблона, как это
template<typename ... Args> struct A;
template<>
struct A<>{
};
template<typename First, typename ... Args>
struct A<First, Args...>:private A<Args...>{
typedef A<Args...> child;
typedef A<First, Args...> self;
typedef First type;
static const size_t size = 1 + sizeof...(Args);
type value;
template<typename ... _Args>
A(First && first, _Args && ... args) :child(forward<_Args>(args)...),value(move(first)){}//move
template<typename ... _Args>
A(const First & first, _Args && ... args) :child(forward<_Args>(args)...), value(first){}//assign
};
Если я назову эту структуру, как показано ниже;
int f= 6;
A<int, int, int> g(f, 5, f); //it is working
A<int&> i(f);//not working compile error
Второй не работает, потому что конструктор rvalue не может сначала присвоить значение.
Что я должен сделать для второй работы?
1 ответ
Решение
Ваша большая проблема в том, что когда First
является ссылкой на lvalue (скажем, T &
), и то и другое First &&
а также const First &
становится T &
Это означает, что ваши два конструктора имеют одинаковую подпись, что, очевидно, является недопустимым. (const First &
это "ссылка на const First
", но так как сами ссылки неизменны, когда First
является ссылочным типом, само const не имеет смысла.)
Одним из возможных исправлений было бы заставить ваш конструктор принимать универсальные ссылки и для первого параметра, то есть:
template<typename F, typename ... Cargs>
A(F&& first, Cargs && ... args) :child(forward<Cargs>(args)...),value(forward<F>(first)){}