struct box
{
int array[3];
};
int main()
{
box a = {1};
}
Если вышеприведенное работает в С++, то почему это не работает?
struct box
{
int simple_int;
};
int main()
{
box b = 2;
}
В чем причина?
Ответ 1
Правильно, первый использовал бы box a = { { 1 } }, так что у вас есть один набор фигурных скобок для каждого агрегата. Внешний набор фигурных скобок для структуры, а внутренний набор для массива. Однако, язык позволяет вам опустить внутренние фигурные скобки.
В последнем нет внутренних брекетов, чтобы опустить. Вы не можете опустить внешние фигурные скобки; у вас должен быть хотя бы один набор фигурных скобок, чтобы отличить список инициализаторов для совокупности. В некотором смысле фигурные скобки говорят: "Вот список вещей, которые нужно внести в совокупность". Когда вы пишете box b = 2, компилятор не знает, что вы хотите разместить 2 внутри совокупность. Вместо этого, похоже, вы пытаетесь инициализировать объект b (а не его часть) на 2. Поэтому компилятор пытается найти конструктор или преобразование, которое изменяет 2 на box. Когда это не удается, вы получите сообщение об ошибке.
Ответ 2
Это не работает, потому что ваш синтаксис неверен. Вы можете добавить поддержку для b = 2 с неявным конструктором, если это то, что вы хотите.
box b = {2}; // correct syntax with no constructor
или
struct box
{
// implicit constructor
box(int i) : i(i) {}
int i;
};
box b(2);
box c = 2;
или
struct box
{
explicit box(int i) : i(i) {}
int i;
};
box b(2);
box c = 2; // disallowed