对不起,过于模糊的标题(由于缺乏我的英语技能).请建议一个更好的标题.
请考虑以下代码.
struct A {
typedef std::vector<double> State;
// template <class... Args>
// A(Args... args)
// : a(args...)
// {}
template <class... Args>
A(Args&&... args)
: a(std::forward<Args>(args)...)
{}
A(const A&) = default;
A(A&&) = default;
State a;
};
int main(){
A a(3,2);
A b = a; // This line triggers an error!!
}
Gcc 4.8.0无法使用错误消息进行编译
错误:调用’std :: vector< double> :: vector(A&)’的匹配函数:a(std :: forward< Args>(args)…).
我不明白为什么这个代码是错误的.在我看来,编译器应该调用A行= a的行中的复制构造函数.
但是,如果我用已注释的替换构造函数(简单地取值).它编译.此外,现在不需要默认的复制(和移动)构造函数.
这里发生了什么?
解决方法
在C 11中,编译器会自动推断出模板参数(就像模板化构造函数一样),并应用&该类型创建一个通用引用,它与任何具有任何cv限定的类型匹配,无论它是一个左值还是右值引用.
所以在你的情况下,你正在通过A,因此Args … = A& Args&& … = A& &&,A&&由于引用崩溃规则,它比const A& amp;更好的匹配,因为编译器不必为非const变量添加const.