2012-06-06 1 views
1
struct E_Point { 
    double x, y; 
    E_Point(): x(0), y(0) {} 
    E_Point(double x, double y) : x(x), y(y) {} 
}; 

E_Point problem[] = { 
    {0.3871953044519425, -0.91857980824611341}, // Error: initialization of non-aggregate type 'E_Point' with an initializer list 
    {0.36139704793723609, 0.91605957361605106}, 
    {-0.8208980020500205, 0.52853407296583088}, 
    {0.36178501611208552, 0.88880385168617226}, 
    {-0.43211245441046209, 0.6803420222771047} 
}; 

Компиляция с clang 3.1.Инициализация простых структур с использованием списков инициализаций с помощью clang

Следует отметить, что это компилируется на GCC 4.6.1.

Мое настоящее понимание заключается в том, что problem является неагрегатным типом, потому что он представляет собой массив структур, что делает его составным, а не просто просто структурой или массивом.

Но отправка флага -std=c++11 в clang не облегчает проблему.

Обновление: Хорошо. Похоже, моя версия clang как-то испорчена и не может справиться с этим по какой-либо причине.

Что является более традиционным способом инициализации? Я делаю это так? Это компилируется, но создает ли тот же код? Будет ли он называть ctor, пока оригинал не будет?

E_Point problem[] = { 
    E_Point(0.3871953044519425, -0.91857980824611341), // 1559 
    E_Point(0.36139704793723609, 0.91605957361605106), // 1560 
    E_Point(-0.8208980020500205, 0.52853407296583088), // 1798 
    E_Point(0.36178501611208552, 0.88880385168617226), // 1799 
    E_Point(-0.43211245441046209, 0.6803420222771047) // 1800 
}; 
+0

Время переключения компилятора? [Компилирует файл с gcc 4.3.4] (http://ideone.com/z00cC) –

+0

Ну, я хочу посмотреть, есть ли флаг clang для компиляции этого или объяснение того, почему clang не поддерживает списки инициализаций, -агрегатные типы. Я, конечно, могу сделать инициализацию немного более подробной, поэтому она будет компилироваться отлично, но это не доходит до сути проблемы. –

+2

Да, у него есть [дополнительный флаг] (http://clang.llvm.org/docs/LanguageExtensions.html#cxx11), возможно, вы его не включили, что-то вроде 'clang ++ -std = C++ 11 [files] ', По умолчанию clang не включает возможности C++ 11, вы должны явно указывать. –

ответ

2

Это ошибка в звоном ++:

http://llvm.org/bugs/show_bug.cgi?id=12670

В вашем случае вы можете просто использовать явный вызов конструктора, Вы обеспечиваете в последнем фрагменте кода. Что касается того, действительно ли семантика одинакова (будет генерировать тот же код), в большинстве случаев это будет.

Случая, когда измененный синтаксис будет приводить к различному поведению, когда тип строится имеет конструктор, который принимает std::initializer_list<>, и в этом случае скобка-инициализатор построит этот список инициализатора. Если у такого типа нет такого конструктора, как и в вашем случае, то назначается соответствующий конструктор brace-initializer.

+0

Все еще не исправлено с недавно обновленным clang-318.0.61 –