title: Why can't I initialize an array of objects if they have private copy constructors?
body: <p>I just ran across some unexpected and frustrating behaviour while working on a C++ project.  My actual code is a tad more complicated, but the following example captures it just as well:</p>
  
  <pre><code>class Irritating
  {
      public:  Irritating() {}
      private: Irritating(const Irritating&amp; other) {}
  };
  
  const Irritating singleton;                // Works just fine.
  const Irritating array[] = {Irritating()}; // Compilation error.
  
  int main()
  {
      return 0;
  }
  </code></pre>
  
  <p>Trying to compile this produces the following error (GCC version thrown in just in case):</p>
  
  <pre><code>[holt@Michaela irritating]$ g++ --version
  g++ (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)
  Copyright (C) 2011 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  
  [holt@Michaela irritating]$ g++ test.cpp
  test.cpp:4:11: error: ‘Irritating::Irritating(const Irritating&amp;)’ is private
  test.cpp:8:41: error: within this context
  [holt@Michaela irritating]$ 
  </code></pre>
  
  <p>The offending object, unfortunately, is from an external library and outside my control.  My current workaround is to use an array of pointers; it works, but it feels a bit hackish and adds a needless layer of indirection.  Is there a better way to do this?</p>
  
  <p>Also:  The array is constant and global (well, class-static in the actual code); why isn't it being initialized in place?  Is this expected C++ behaviour, or a bug/quirk of GCC?</p>
  
  <p><strong>Update:</strong> Installed Clang just to see if it would agree with GCC.  Sadly, it did:</p>
  
  <pre><code>[holt@Michaela irritating]$ clang test.cpp
  test.cpp:8:29: warning: C++98 requires an accessible copy constructor for class 'Irritating' when binding a reference to a temporary; was private
        [-Wbind-to-temporary-copy]
  const Irritating array[] = {Irritating()};
                              ^
  test.cpp:4:11: note: declared private here
          private: Irritating(const Irritating&amp; other) {}
                   ^
  test.cpp:8:29: error: calling a private constructor of class 'Irritating'
  const Irritating array[] = {Irritating()};
                              ^
  test.cpp:4:11: note: declared private here
          private: Irritating(const Irritating&amp; other) {}
                   ^
  1 warning and 1 error generated.
  [holt@Michaela irritating]$
  </code></pre>