Sun*_*min 10 c++ default-copy-constructor c++11
对于过于含糊的标题感到抱歉.(由于缺乏我的英语技能).请建议一个更好的标题.
请考虑以下代码.
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!!
}
Run Code Online (Sandbox Code Playgroud)
Gcc 4.8.0无法使用错误消息进行编译
error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...).
我无法理解为什么这段代码错了.在我看来,编译器应该在行中调用复制构造函数A b = a;.
但是,如果我用注释的(它只是取值)替换构造函数.它确实编译.此外,现在不需要默认复制(和移动)构造函数的行.这里发生了什么?
在C++ 11中,编译器会自动推导出模板参数(正如您必须使用模板化构造函数)并应用于&&该类型会创建一个通用引用,它将任何类型与任何cv限定匹配,无论它是左值还是右值引用.
因此,在你的情况下,你传入一个A,因此Args...= A &,Args &&...= A & &&,这是A &由于引用折叠规则,这是一个更好的匹配const A &,因为编译器不必将constness添加到非const变量.