#include <stdlib.h>
void *operator new[](size_t size, int n){
if( size != 0 && n != 0 )
return calloc(n, size);
return calloc(1, 1);
}
int main(){
int * p1;
const int i = 0;
// p1 = new (20) int[i] ; // Case 1 (OK)
p1 = new (20) (int[i]); // Case 2 (Warning)
if( p1 == 0 )
return 1;
return 0;
}
Этот код (https://godbolt.org/g/hjo7Xn) успешно компилируется с Clang 6.0.0, однако GCC 7.3 выдает предупреждение о том, что массивы нулевой длины запрещены в C++. Если скобки удалены (Случай 1), предупреждение исчезает.
В отличие от статически выделенных массивов нулевой длины (C++03:8.3.4/1), динамически размещаемые массивы нулевой длины разрешены (C++03:5.3.4/6). Тем не менее, в стандарте C++ последние явно разрешены только при следовании одному из двух возможных синтаксических путей нового-выражения, то есть пути с идентификатором нового-типа em> и без скобок (случай 1).
Разрешено ли стандартом C++ использовать new-expression с массивом нулевой длины, следующим за вторым синтаксическим путем, то есть с идентификатором_типа и круглые скобки (случай 2)?
Единственная связанная цитата - С++ 03:5.3.4/5:
Когда выделенный объект является массивом (то есть используется синтаксис direct-new-declarator или идентификатор нового типа или идентификатор типа em> обозначает тип массива), new-expression возвращает указатель на начальный элемент (если есть) массива.
Формулировка (if any)
допускает массив без элементов, однако неясно, относится ли она к обоим случаям или только к варианту с идентификатором нового типа и без круглых скобок (случай 1).
Заранее спасибо.
Примечания:
- ISO/IEC 14882:2003, раздел 8.3.4, параграф 1:
#P9#
- ISO/IEC 14882:2003, раздел 5.3.4, параграф 6:
#P10#
- ISO/IEC 14882:2003, раздел 5.3.4, параграф 7:
#P11#
- ISO/IEC 14882:2003, раздел 5.3.4, параграф 1:
#P12# #P13# #P14#
- Хотя приведенные выше цитаты взяты из стандарта С++ 03, насколько мне известно, эта проблема все еще неясна в более новых версиях стандарта С++ (С++ 11, С++ 14 и С++ 17).
- Интересный пост Херба Саттера о нуле -длинные массивы.
- Код в примере представляет собой слегка измененный тест из пакета SuperTest SolidSands.
operator new[]
? Какое это имеет отношение к чему-либо? - person Cheers and hth. - Alf   schedule 30.04.2018