为什么我得到错误"没有匹配函数来调用A :: A(A)"在Linux上但不在Windows上

时间:2014-11-17 06:16:56

标签: c++ linux compiler-errors

使用g++ test.cpp编译时,以下代码在Linux上引发错误:

#include <iostream>

using namespace std;

class A
{
public:
    A(){
        cout << "call A()" << endl;
    };
    A& operator = (const A& a) {
        cout << "call operator =" << endl;
        return *this;
    }
    A(A& a) {
        cout << "call A(A& a)" << endl;
    }
};

A operator - (A& a1, A& a2)
{
    cout << "call operate -" << endl;
    return a1;
}

int main()
{
    A a1;
    A a2;
    A a3 = a1 - a2;
    //a1 = a2;
    return 0;
}

错误是:

test.cpp: In function ‘int main()’:
test.cpp:30: error: no matching function for call to ‘A::A(A)’
test.cpp:15: note: candidates are: A::A(A&)
test.cpp:8: note:                 A::A()

但是在使用Visual Studio 2010进行编译时,它适用于Windows。为什么?我在Linux上的代码出了什么问题?

1 个答案:

答案 0 :(得分:9)

在线

A a3 = a1 - a2;

此处,您减去了a1a2,从而产生了临时值(一个prvalue,技术上)。但是,您的复制构造函数需要非const左值引用:

A(A& a) { ... }

C ++标准不允许这样做: prvalues无法绑定到非const左值引用。您应该在复制构造函数中使用const引用参数:

A(const A& a) { ... }

至于为什么这被Visual C ++接受,这似乎是为了向后兼容而保留的语言扩展,Brian说。请参阅similar questions