Ang*_*gry 10 c++ copy-constructor
class A
{
public:
A(const int n_);
A(const A& that_);
A& operator=(const A& that_);
};
A::A(const int n_)
{ cout << "A::A(int), n_=" << n_ << endl; }
A::A(const A& that_) // This is line 21
{ cout << "A::A(const A&)" << endl; }
A& A::operator=(const A& that_)
{ cout << "A::operator=(const A&)" << endl; }
int foo(const A& a_)
{ return 20; }
int main()
{
A a(foo(A(10))); // This is line 38
return 0;
}
Run Code Online (Sandbox Code Playgroud)
执行此代码给出了o/p:
A :: A(int),n_ = 10
A :: A(int),n_ = 20
显然,永远不会调用复制构造函数.
class A
{
public:
A(const int n_);
A& operator=(const A& that_);
private:
A(const A& that_);
};
Run Code Online (Sandbox Code Playgroud)
但是,如果我们将其设为私有,则会发生以下编译错误:
Test.cpp:在函数'int main()'中:
Test.cpp:21:错误:'A :: A(const A&)'是私有的
Test.cpp:38:错误:在此上下文中
为什么编译器在实际上没有使用复制构造函数时会抱怨?
我使用的是gcc 4.1.2版20070925(Red Hat 4.1.2-33)
Jam*_*kin 12
核心缺陷391解释了这个问题.
基本上,当前的C++标准要求在将类临时类型传递给const引用时可以使用复制构造函数.
此要求将在C++ 0x中删除.
需要复制构造函数的逻辑来自这种情况:
C f();
const C& r = f(); // a copy is generated for r to refer to
Run Code Online (Sandbox Code Playgroud)
2003年标准,§12.2/ 1,规定:
即使在避免创建临时对象时(12.8),也必须遵守所有语义限制,就像创建临时对象一样.[示例:即使未调用复制构造函数,也应满足所有语义限制,例如可访问性(第11节).]
周围有类似的例子.根据我的收集,编译器可以自由生成临时数据或优化它们.