Ошибка компиляции инициализации структуры С++ 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
Ответы
Ответ 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;};
обмен точкой с запятой в запятую, возможно
Я просто