为什么复制ctor在此代码中使用?

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)


aib*_*aib 5

2003年标准,§12.2/ 1,规定:

即使在避免创建临时对象时(12.8),也必须遵守所有语义限制,就像创建临时对象一样.[示例:即使未调用复制构造函数,也应满足所有语义限制,例如可访问性(第11节).]

周围有类似的例子.根据我的收集,编译器可以自由生成临时数据或优化它们.