Один вопрос о массиве без конструктора по умолчанию в C++

Из предыдущего поста я узнал, что существует два способа, по крайней мере, объявить массив без конструкторов по умолчанию. Как это

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

Кто-нибудь может объяснить мне, почему это происходит?

1 ответ

Решение

Первый не будет создавать объекты напрямую. Сначала будет построен временный Foo, а затем скопируйте Foo в элемент. Это похоже на ваш второй способ. Разница в том, что ваш второй способ не будет работать с explicit Копируй конструктор, пока твоя первая будет. И наоборот, первый не будет работать с explicit взятие конструктора intВторое будет. Другими словами, первый конструктор, используемый при инициализации элемента, не должен быть explicit,

Обратите внимание, что ни один из способов не нужно копировать. Но им все еще нужно проверить, доступны ли конструкторы копирования. Таким образом, они должны вести себя так, как если бы они копировали, но им не нужно делать копию.

Другие вопросы по тегам