Переменное количество аргументов в конструкторе int
Я написал следующий фрагмент кода, который приводил к ошибкам компиляции при выполнении на codepad.org
int main()
{
int *p = new int(5,6,7);
return 0;
}
Я передавал 3 числа аргументов в конструктор int при динамическом выделении памяти для него (что, по моему мнению, не должно работать).
Но когда я выполнил тот же код в компиляторе Visual Studio 2010, он компилирует и инициализирует значение с последним аргументом. Почему это работает так?
2 ответа
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
имеет несколько выражений, поэтому компиляторы должны диагностировать это как ошибку.