В C ++ 14 допустимо ли использовать double в измерении нового выражения? - PullRequest
0 голосов
/ 12 декабря 2018

В C ++ 14 задан следующий код:

void foo() {
  double d = 5.0;
  auto p1 = new int[d];
}

clang компилирует это без диагностики, в то время как gcc, с другой стороны, выдает следующую диагностику ( смотри в прямом эфире в godbolt ):

error: expression in new-declarator must have integral or enumeration type
    7 |     auto p1 = new int[d];
      |                       ^

Я специально обозначил этот C ++ 14, потому что в режиме C ++ 11 clang воспринимает это как плохо сформированное и выдает следующую диагностику ( смотри вживую в Godbolt ):

error: array size expression must have integral or unscoped enumeration type, not 'double'
    auto p1 = new int[d];
              ^       ~

Правильный ли лязг?Если так, что изменилось в C ++ 14, чтобы разрешить это?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

От до (для тех, кто интересуется, как я), выражение остается практически таким же (в отличие от C ++ 11 до C++ 14, как ответил @ShafikYaghmour), как указано в этом C ++ 17 проекте :

Каждый константное выражение в noptr-new-декларатор должен быть преобразованным константным выражением типа std::size_t и должен принимать строго положительное значение. Выражение в noptr-new-Declarator неявно преобразуется в std::size_t.[..]

только эта часть ([expr.const]) отсутствует в черновике C ++ 17.

0 голосов
/ 12 декабря 2018

Clang верен, ключевая формулировка в [expr.new] p6 отличается от следующей в черновике C ++ 11:

Каждая константа-Выражение в noptr-new-объявителе должно быть целочисленным константным выражением ([expr.const]) и иметь строго положительное значение. Выражение в noptr-new-объявителе должно иметь целочисленный тип, тип перечисления с незаданной областью или тип класса, для которого существует одна неявная функция преобразования в тип целочисленного или незаданного перечисления ([class.conv]).Если выражение относится к типу класса, выражение конвертируется путем вызова этой функции преобразования, и результат преобразования используется вместо исходного выражения.…

до это в проекте C ++ 14 :

Каждое выражение-константы в noptr-new-объявитель должен быть преобразованным константным выражением ([expr.const]) типа std::size_t и должен принимать строго положительное значение. Выражение в noptr-new-Declarator неявно преобразуется в std::size_t.…

В C ++ 14 требование к выражению в noptr-new-объявителе было ослаблено, чтобы не требовать целочисленного перечисления с незаданной областью или класса с одним не- явная функция преобразования в один из этих типов, но допускается только неявное преобразование в size_t .

Изменение в формулировке произошло из предложения Предложение для настройки некоторых контекстных преобразований C ++, версия 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...