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

Posted

技术标签:

【中文标题】带有引用参数的模板结构构造函数【英文标题】:template structure constructor with reference parameter 【发布时间】:2014-08-02 22:42:38 【问题描述】:

我有一个这样的模板结构

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

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

【问题讨论】:

_Args 是保留标识符(以下划线开头,后跟大写字母)。 【参考方案1】:

您更大的问题是当First 是左值引用(例如T &amp;)时,First &amp;&amp;const First &amp; 都变为T &amp;,这意味着您的两个构造函数具有相同的签名,这显然是非法的。 (const First &amp; 是“对 const First 的引用”,但由于引用本身是不可变的,所以当 First 本身是引用类型时,const 是没有意义的。)

一个可能的解决方法是让您的构造函数也为第一个参数采用通用引用,即:

template<typename F, typename ... Cargs>
A(F&& first, Cargs && ... args) :child(forward<Cargs>(args)...),value(forward<F>(first))

Demo.

【讨论】:

以上是关于带有引用参数的模板结构构造函数的主要内容,如果未能解决你的问题,请参考以下文章

对带有数组的构造函数的未定义引用[重复]

为什么类的拷贝构造参数加引用重载赋值函数的返回值和参数加引用

为啥 std::pair 对于 const 引用和转发引用参数有两个不同的构造函数?

带有接受参数的构造函数的 C# Singleton

为啥复制构造函数应该在 C++ 中通过引用来接受它的参数?

原来... 拷贝构造函数的参数为什么必须使用引用类型