带参考参数的模板结构构造函数

时间:2014-08-02 22:42:39

标签: c++ templates constructor lvalue rvalue

我有像这样的模板结构

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 个答案:

答案 0 :(得分:2)

更大的问题是,当First是左值参考(例如,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)){}

Demo