В C ++ 14 допустимо ли использовать double в измерении нового выражения?

В 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, чтобы это разрешить?

41

Решение

Лязг правильно, ключевая формулировка в [Expr.new] р6 отличается от следующего в проекте C ++ 11:

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

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

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

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

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

43

Другие решения

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

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

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

1

По вопросам рекламы [email protected]