使用公共赋值运算符的私有副本ctor时出错

sdu*_*umi 6 c++ copy-constructor assignment-operator

你们其中一个人可以解释为什么下面这段代码不能编译吗?

#include <iostream>

using namespace std;

class Foo
{
public:
  Foo() { cout << "Foo::Foo()" << endl << endl; }
  Foo& operator=(const Foo&) { cout << "Foo::operator=(const Foo&)" << endl << endl; }
private:
  Foo(const Foo& b) { *this = b; cout << "Foo::Foo(const Foo&)" << endl << endl; }
};

int main()
{
  Foo foo;

  foo = Foo();
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误:

$ g++ -o copy_ctor_assign copy_ctor_assign.cc && ./copy_ctor_assign
copy_ctor_assign.cc: In function 'int main()':
copy_ctor_assign.cc:10: error: 'Foo::Foo(const Foo&)' is private
copy_ctor_assign.cc:17: error: within this context
Run Code Online (Sandbox Code Playgroud)

注意:当我删除private: keyword时,代码会编译,但永远不会调用copy ctor.那么为什么它是私有的呢?

不确定它是否重要,但我正在使用:

$ g++ --version
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)
Copyright (C) 2006 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

Ore*_*n S 5

您正在初始化临时引用.
标准规定:
临时应初始化(8.5.3参数5)"使用非参考拷贝初始化规则(8.5)".

临时删除复制结构(标准允许.12.8标准杆5).
但是,该标准明确指出(12.2 par 1):
"即使避免创建临时对象(12.8),也必须尊重所有语义限制,就像创建临时对象一样.[例如:即使复制构造函数如果没有被调用,则应满足所有语义限制,例如可访问性(第11条).]"

(另外,在寻找合适的报价时,发现这个重复 :)

编辑:从标准中添加相关位置