抱歉标题过于模棱两可。(由于我的英语能力不足)。请推荐一个更好的标题。
请考虑以下代码。
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 无法通过错误消息编译它
error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...)
。
我不明白为什么这段代码是错误的。在我看来,编译器应该在行中调用复制构造函数A b = a;
。
但是,如果我用注释的构造函数替换构造函数(它只接受值)。它确实编译。此外,现在不需要默认复制(和移动)构造函数的行。这里会发生什么?