2

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

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)}; 

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

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)};      
}

谁能向我解释为什么会发生这种情况?

4

1 回答 1

5

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

请注意,两种方式都不需要复制。但他们仍然需要检查复制构造函数是否可访问。所以,他们应该表现得好像他们会复制一样,但他们并不真的需要复制。

于 2010-03-06T16:25:38.550 回答