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

Это недопустимый С++?

struct HybridExpression {
    RawExpressionElement *ree;
    ExpressionNode *en;
};    

vector<HybridExpression> hexpression;

hexpression.insert(hexpression.begin() + starti, 
        (HybridExpression) {NULL, en}); 

gcc строит без предупреждения, но visual studio 2010 даже не компилирует его.

Ему не нравится этот бит: (HybridExpression) {NULL, en}

4b9b3361

Ответ 1

Это используется часть языка программирования C, которая не включена в С++, она называется "составной литерал". g++ -ansi будет диагностировать это, говоря

предупреждение: ISO С++ запрещает составные литералы

Это не часть С++ 0x.

Синтаксис, совместимый с С++ 0x, был бы

hexpression.insert(hexpression.begin() + starti, HybridExpression{NULL, en});

Чтобы указать стандарт C99, пункт 6.5.2.5:

Постфиксное выражение, состоящее из скобок        имя типа, за которым следует список инициализаторов, заключенный в скобки        является составным литералом. Он предоставляет неназванный объект, чей        значение задается в списке инициализаторов.

Ответ 3

Это недействительно С++ в текущем стандарте. Я думаю, что GCC позволяет это из-за расширения компилятора, специфичного для GCC.