Это недопустимый С++?
struct HybridExpression {
RawExpressionElement *ree;
ExpressionNode *en;
};
vector<HybridExpression> hexpression;
hexpression.insert(hexpression.begin() + starti,
(HybridExpression) {NULL, en});
gcc строит без предупреждения, но visual studio 2010 даже не компилирует его.
Ему не нравится этот бит: (HybridExpression) {NULL, en}
Ответы
Ответ 1
Это используется часть языка программирования C, которая не включена в С++, она называется "составной литерал". g++ -ansi
будет диагностировать это, говоря
предупреждение: ISO С++ запрещает составные литералы
Это не часть С++ 0x.
Синтаксис, совместимый с С++ 0x, был бы
hexpression.insert(hexpression.begin() + starti, HybridExpression{NULL, en});
Чтобы указать стандарт C99, пункт 6.5.2.5:
Постфиксное выражение, состоящее из скобок имя типа, за которым следует список инициализаторов, заключенный в скобки является составным литералом. Он предоставляет неназванный объект, чей значение задается в списке инициализаторов.
Ответ 2
В соответствии с http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/C_002b_002b-Extensions.html#C_002b_002b-Extensions вы можете использовать C-расширения (включая материал C99) в программах на С++, скомпилированных с помощью GCC.
Компонентные литералы - это расширение, которое вы фактически используете.
Ответ 3
Это недействительно С++ в текущем стандарте. Я думаю, что GCC позволяет это из-за расширения компилятора, специфичного для GCC.