关于C++中没有默认构造函数的数组的一个问题

sky*_*oor 2 c++ arrays copy-constructor

从上一篇文章中我了解到,至少有两种方法可以声明一个没有默认构造函数的数组.像这样

class Foo{
  public:
  Foo(int i) {}     
};
   Foo f[5] = {1,2,3,4,5};
   Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)}; 
Run Code Online (Sandbox Code Playgroud)

我还了解到,第一个将直接使用参数构造对象,此处使用第二个复制构造函数.但是,当我测试下面的代码时.我将复制构造函数设为私有.我希望看到复制构造函数用法的不同.但这不是我的预期.这两个声明都没有起作用.

class Foo{
  public:
  Foo(int i) {}     
  private:
  Foo(const Foo& f) {}
};
int main(){

   Foo f[5] = {1,2,3,4,5};
   Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)};      
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么会发生这种情况?

Joh*_*itb 5

第一个不会直接构造对象.它将首先构造一个临时的Foo,然后复制Foo到元素中.它与你的第二种方式类似.不同的是,你的第二种方式不适用于explicit复制构造函数,而你的第一种方式.相反,第一个将不会与explicit构造函数采取int,而第二个将.换句话说,元素初始化中使用的第一个构造函数不能是explicit.

请注意,这两种方式都不需要复制.但是他们仍然需要检查复制构造函数是否可访问.因此,他们应该表现得如果他们会复制,但他们并不真的需要复制.