редактировать Пример немного подправлен на основе комментариев
Небольшой код, а затем вопрос (просто чтобы уточнить, это вопрос 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>();
}
Здесь есть несколько вопросов:
MyStruct1
быть инициализирован таким образомДля справки, я пытаюсь использовать конструкторы как средство для принудительной инициализации выделенных структур стека, но я не хочу запрещать этот стиль инициализации.
Какое волшебство происходит, что позволяет экземпляру MyStruct1 быть инициализированным таким образом
Ну, нет никакой «магии» как таковой. MyStruct1
является агрегатным типом, но, благодаря ctor, MyStruct2
не является. Вы пытаетесь выполнить агрегатную инициализацию, которая может быть успешной только для объекта агрегатного типа.
Есть ли обходной путь для этого в C ++ 98?
Сделай свой конструктор делать свою работу и возьмите аргументы, необходимые для инициализации.
Попытка использовать конструкторы для первоначальной инициализации нуля, кажется, что вы наполовину думали в C и наполовину думали в C ++ (коррелирует с использованием устаревшего typedef struct
идиома, которая не требовалась в C ++ на протяжении десятилетий).
Других решений пока нет …