Variadic模板和复制构造函数

Kai*_*aan 0 c++ c++11 visual-studio-2013

为什么以下不编译:

struct a
{
    int i;
};


template <typename T>
class b
{
public:
    T mItem;


    template <typename... Arguments>
    b(Arguments&&... args) : mItem(std::forward<Arguments>(args)...)
    {
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    b<a>(1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误C2664:'a :: a(const a&)':无法将参数1从'int'转换为'const a&'

但只需添加这样的额外参数就可以编译:

struct a
{
    int i;
};


template <typename T>
class b
{
public:
    T mItem;


    template <typename... Arguments>
    // just random extra argument
    b(int, Arguments&&... args) : mItem(std::forward<Arguments>(args)...)
    {
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    b<a>(1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有没有比简单地为b的构造函数添加额外(无用)参数更简洁的方法?

Tar*_*ama 5

您正在尝试依赖聚合初始化,但您需要使用大括号而不是括号来使用它:

template <typename... Arguments>
b(Arguments&&... args) : mItem{std::forward<Arguments>(args)...}
{
}
Run Code Online (Sandbox Code Playgroud)

大括号意味着您正在使用列表初始化而不是值/直接初始化.前者在T聚合类型时解析为聚合初始化,但后两者不解决.是的,C++初始化规则很奇怪.