Я написал следующий фрагмент кода, который привел к ошибкам компиляции при выполнении на
codepad.org
int main()
{
int *p = new int(5,6,7);
return 0;
}
Я передавал 3 числа аргументов в конструктор int при динамическом выделении памяти для него (что, по моему мнению, не должно работать).
Но когда я выполнил тот же код в компиляторе Visual Studio 2010, он компилирует и инициализирует значение с последним аргументом. Почему это работает так?
VS2010 вызывает оператор commo и правильно присваивает последнее значение.
http://en.wikipedia.org/wiki/Comma_operator
Для GCC попробуйте это
int main()
{
int *p = new int((5,6,7));
return 0;
}
VS2010 не соответствует (сюрприз). (5,6,7)
в new int(5,6,7)
это новый инициализатор. В соответствии с C ++ 11 §5.3.4 / 15:
новое выражение который создает объект типа
T
инициализирует этот объект следующим образом:
Если новый инициализатор опущен, объект инициализирован по умолчанию (8.5); если инициализация не выполняется, объект имеет неопределенное значение.
В противном случае новый инициализатор интерпретируется в соответствии с правилами инициализации 8.5 для прямой инициализации.
и §8.5 / 13 гласит:
Если инициализируемая сущность не имеет типа класса, список_выражений в инициализаторе в скобках должно быть одно выражение.
список_выражений в вашем примере 5,6,7
имеет несколько выражений, поэтому компиляторы должны диагностировать это как ошибку.