G ++ 4.5 Ошибка: нет диагностики для сужения в списке инициализатора - PullRequest
6 голосов
/ 22 августа 2010

Я попробовал следующий код:

int main()
{
   int x {23.22};
}

, который включает в себя инициализацию, требующую сужения, но код компилируется без ошибок или предупреждений.С другой стороны, следующий код выдает ошибку:

int main()
{
   int x[]{23.22};
}

Я нашел ошибку или что?

PS: в настоящее время я использую GCC 4.5.0

Ответы [ 2 ]

7 голосов
/ 22 августа 2010

Похоже, ошибка. Следующее прямо из черновика n3092:

8.5.4 Инициализация списка

- В противном случае, если список инициализатора имеет один элемент, объект инициализируется из этого элемента; если сужение конверсии (см. ниже) требуется преобразовать элемент в T, программа некорректна.

int x1 {2}; // OK
int x2 {2.0}; // error: narrowing

Здесь вы можете посмотреть на соответствие G ++ C ++ 0X . Состояние списков инициализаторов ( N2672 ) - «Да», но обратите внимание, что это всего лишь эксперимент (и, следовательно, вы можете ожидать ошибки).

Обновление с отчет об ошибке : GCC выдает предупреждение с флагом -Wconversion (и нет, это не охватывается -Wall).

0 голосов
/ 22 августа 2010

Поскольку поддержка C ++ 0x все еще реализуется, даже если в соответствии со Стандартом должно быть сообщение об ошибке или предупреждении, а это не так, это не обязательно делает его ошибкой, просто еще предстоит реализовать.Это также может произойти, если проект стандарта был изменен с тех пор, как была реализована эта конкретная функция.

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

...