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

Странное поведение структур в С++ [часть 1]

Рассмотрим:

struct box
{
    int array[3];
};

int main()
{
    box a = {1};
}

Если вышеприведенное работает в С++, то почему это не работает?

struct box
{
    int simple_int;
};

int main()
{
    box b = 2;
}

В чем причина?

4b9b3361

Ответ 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