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的构造函数添加额外(无用)参数更简洁的方法?
您正在尝试依赖聚合初始化,但您需要使用大括号而不是括号来使用它:
template <typename... Arguments>
b(Arguments&&... args) : mItem{std::forward<Arguments>(args)...}
{
}
Run Code Online (Sandbox Code Playgroud)
大括号意味着您正在使用列表初始化而不是值/直接初始化.前者在T聚合类型时解析为聚合初始化,但后两者不解决.是的,C++初始化规则很奇怪.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |