为什么以下不编译:
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;
}
error C2664: 'a::a(const a &)' : cannot convert argument 1 from 'int' to '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;
}
有没有比简单地向 b 的构造函数添加一个额外的(无用的)参数更简洁的方法?
最佳答案
你试图依赖聚合初始化,但你需要使用大括号而不是圆括号来使用它:
template <typename... Arguments>
b(Arguments&&... args) : mItem{std::forward<Arguments>(args)...}
{
}
大括号表示您正在使用列表初始化而不是值/直接初始化。当 T
是聚合类型时,前者解析为聚合初始化,但后两者不是。是的,C++ 初始化规则很奇怪。
关于c++ - 可变参数模板和复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32784525/