Подтвердить что ты не робот

Ошибка компиляции инициализации структуры С++ 11

struct SS {int a; int s;};

int main ()
{
   vector<SS> v;
   v.push_back(SS{1, 2});
}

Код может быть скомпилирован без каких-либо ошибок. Однако, когда структура инициализируется в классе, я получил ошибку компиляции. Кто-нибудь может объяснить это?

struct SS {int a = 0; int s = 2;};

Ошибка:

In function ‘int main()’:
error: no matching function for call to ‘SS::SS(<brace-enclosed initializer list>)’
     v.push_back(SS{1, 2});
                        ^
note: candidates are:
note: constexpr SS::SS()
 struct SS {int a = 0; int s = 2;};
        ^
note:   candidate expects 0 arguments, 2 provided
note: constexpr SS::SS(const SS&)
note:   candidate expects 1 argument, 2 provided
note: constexpr SS::SS(SS&&)
note:   candidate expects 1 argument, 2 provided
4b9b3361

Ответ 1

В С++ 11, когда вы используете инициализацию члена не статической информации в точке объявления, как вы здесь:

struct SS {int a = 0; int s = 2;};

вы делаете класс без агрегата. Это означает, что вы больше не можете инициализировать такой экземпляр:

SS s{1,2};

Чтобы этот синтаксис инициализации работал для неагрегата, вам нужно добавить конструктор с двумя параметрами:

struct SS 
{
  SS(int a, int s) : a(a), s(s) {}
  int a = 0; 
  int s = 2;
};

Это ограничение было снято в С++ 14.

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

См. соответствующее чтение здесь.

Ответ 2

Использование инициализатора элемента по умолчанию делает класс /struct a неагрегатом:

§ 8.5.1 Агрегаты

Агрегат - это массив или класс (раздел 9) без конструкторов, предоставляемых пользователем (12.1), без элементов с выравниванием или равными для нестатических элементов данных (9.2) нет частных или защищенных нестатических данных (раздел 11), нет базовых классов (раздел 10) и нет виртуальных функций (10.3).

Семантика отличается для агрегатов и неагрегатов:

Агрегаты (например, массивы и структуры):

Initialize members/elements beginning-to-end.

Non-заполнители:

Invoke a constructor.

v.push_back(SS{1, 2}); // Error, it tries to call SS constructor

Это означает, что теперь вам нужен конструктор:

struct SS 
{
  SS(int a, int s) : a(a), s(s) 
  {
  }
  int a = 0; 
  int s = 2;
};

Ответ 3

struct SS {int a = 0, int s = 2;};

обмен точкой с запятой в запятую, возможно Я просто