【发布时间】:2016-06-21 12:10:35
【问题描述】:
我在测试一个小例子时遇到了一个有趣的编译错误:
#include <iostream>
using namespace std;
class A
{
public:
A() { cout <<"A created." <<endl; }
A(A& a) { cout <<"A created by copy constructor." <<endl; }
~A() { cout <<"A destoryed." <<endl; }
};
A CreateObject()
{
A obj;
return obj;
}
int main()
{
A a;
A b;
b= CreateObject();
return 0;
}
这很简单,可能根本没有任何问题。但是,它在编译时提示:
copy_constructor.cpp: In function ‘int main()’:
copy_constructor.cpp:23: error: no matching function for call to ‘A::A(A)’
copy_constructor.cpp:9: note: candidates are: A::A(A&)
似乎程序在编译“b= CreateObject();”时尝试调用复制构造函数但没有匹配的复制构造函数。这不应该发生,因为它只是一个赋值语句,构造函数和普通函数在编译优化上有什么区别?
【问题讨论】:
-
为我编译:coliru.stacked-crooked.com/a/019cc3c18ba2a889。你的编译器和编译选项是什么?
-
复制构造函数应该采用
const引用,而不是可修改的引用。 -
你确定你的真实代码实际上不是
A b = CreateObject();吗? -
这不是拷贝赋值而不是拷贝构造函数吗?
-
@Petr 谢谢!看来你可以很好地编译它。我使用带有“g++ a.cpp -o a”的 g++ 来编译代码,但结果不同,我的编译器信息:g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50) 版权所有 (C) 2006 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不是为了适销性或适合特定目的。
标签: c++ compilation