Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带引用参数的模板结构构造函数_C++_Templates_Constructor_Lvalue_Rvalue - Fatal编程技术网

C++ 带引用参数的模板结构构造函数

C++ 带引用参数的模板结构构造函数,c++,templates,constructor,lvalue,rvalue,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

我有一个这样的模板结构

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
};
模板结构A;
模板
结构A{
};
模板
结构A:私有结构A{
一个孩子;
自我定义;
typedef第一型;
静态常量大小\u t size=1+sizeof…(Args);
类型值;
模板
A(First&&First,_Args&&…Args):子(forward(Args)…),值(move(First)){}//move
模板
A(const First&First,_Args&&…Args):子(forward(Args)…),值(First){}//赋值
};
如果我这样称呼这个结构

int f= 6;  
 A<int, int, int> g(f, 5, f); //it is working   
 A<int&> i(f);//not working  compile error
intf=6;
A g(f,5,f)//它正在工作
A一(f)//不工作编译错误
第二个不起作用,因为右值构造函数无法将第一个赋值。

对于第二个工作,我应该怎么做?

您更大的问题是,当
第一个
是左值引用(例如,
T&
)时,
第一个&&
常量第一个&
都变成了
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)){}
模板
A(F&&first,Cargs&&args):子(forward(args)…),值(forward(first)){}

.

\u Args
是保留标识符(以下划线开头,后跟大写字母)。