为什么不调用复制构造函数?

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;.

但是,如果我用注释的(它只是取值)替换构造函数.它确实编译.此外,现在不需要默认复制(和移动)构造函数的行.这里发生了什么?

Rob*_*ahy 9

在C++ 11中,编译器会自动推导出模板参数(正如您必须使用模板化构造函数)并应用于&&该类型会创建一个通用引用,它将任何类型与任何cv限定匹配,无论它是左值还是右值引用.

因此,在你的情况下,你传入一个A,因此Args...= A &,Args &&...= A & &&,这是A &由于引用折叠规则,这是一个更好的匹配const A &,因为编译器不必将constness添加到非const变量.