При инициализации структуры с синтаксисом = {}, что происходит внутри?

редактировать Пример немного подправлен на основе комментариев

Небольшой код, а затем вопрос (просто чтобы уточнить, это вопрос C ++):

#include <cstdio>

struct MYSTRUCT1 {
int asdf[4];
} MyStruct1;

struct MYSTRUCT2 {
int asdf[4];
MYSTRUCT2() : asdf() {}
} MyStruct2;

template <class T>
void test() {
T blah = {{1,-1,1,-1}};

for( int ii = 0; ii < 4; ii++ ) {
printf( "%d ", blah.asdf[ii] );
}
printf( "\n" );
}

int main() {
// Works fine; MyStruct1 doesn't define a constructor
test<MyStruct1>();
// Doesn't work; g++ complains I need to use `-std=c++0x`
// and/or define a constructor that allows the initialization
// taking place inside `test()`
test<MyStruct2>();
}

Здесь есть несколько вопросов:

  1. Какая магия происходит, что позволяет MyStruct1 быть инициализирован таким образом
  2. Есть ли обходной путь для этого в C ++ 98?

Для справки, я пытаюсь использовать конструкторы как средство для принудительной инициализации выделенных структур стека, но я не хочу запрещать этот стиль инициализации.

0

Решение

Какое волшебство происходит, что позволяет экземпляру MyStruct1 быть инициализированным таким образом

Ну, нет никакой «магии» как таковой. MyStruct1 является агрегатным типом, но, благодаря ctor, MyStruct2 не является. Вы пытаетесь выполнить агрегатную инициализацию, которая может быть успешной только для объекта агрегатного типа.

Есть ли обходной путь для этого в C ++ 98?

Сделай свой конструктор делать свою работу и возьмите аргументы, необходимые для инициализации.

Попытка использовать конструкторы для первоначальной инициализации нуля, кажется, что вы наполовину думали в C и наполовину думали в C ++ (коррелирует с использованием устаревшего typedef struct идиома, которая не требовалась в C ++ на протяжении десятилетий).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]