c++ - 带有引用参数的模板结构构造器

标签 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

第二个不工作,因为右值构造函数不能将第一个赋值给值。
第二个工作应该怎么做?

最佳答案

你更大的问题是,当 First 是左值引用(比如,T &)时,First &&const首先&变成了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 .

关于c++ - 带有引用参数的模板结构构造器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100042/

相关文章:

c++ - clang 的 libc++ 产品准备好了吗?

c++ - 如何查找给定字符串是否符合十六进制表示法,例如。没有正则表达式的 0x34FF?

c++ - 具有不同参数列表的模板对象的模板静态映射

python - 如何加载重载方法

scala - scala 中主构造函数参数的可访问性

C++,2D std::vector,我是否需要显式保留并推回空 vector ?

c++ - 什么 HBRUSH 用于 Internet Explorer 工具栏背景?

C++:使用模板变量进行优化

c++ - 模板运算符[]重载奇怪的C2676

java - 将 ArrayList 转换为 varargs 构造函数的单独参数