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

前端之家收集整理的这篇文章主要介绍了c – 为什么不调用复制构造函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对不起,过于模糊的标题(由于缺乏我的英语技能).请建议一个更好的标题.

请考虑以下代码.

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.

猜你在找的C&C++相关文章