Возвращаемое значение нечленной перегрузки std::empty для массивов фиксированного размера

Документ [принятых] стандартов N4280 добавляет несколько новые функции, не являющиеся членами, будут включены в C++17.

Есть замечания, указывающие на правильные возвращаемые значения для каждой из новых функций, не являющихся членами, и, в частности, меня смущает перегрузка std::empty для массивов фиксированного размера. В документе предполагается, что возвращаемое значение для этой перегрузки всегда будет false; что все массивы фиксированного размера никогда не будут пустыми.

Почему это так? Насколько мне известно, возможно (хотя, возможно, и бесполезно) иметь массив нулевого размера, как в int x[0];, который я бы назвал пустым.

Для справки, конкретная перегрузка, о которой я говорю:

template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept;

person Mark    schedule 24.12.2014    source источник
comment
Если вы скомпилируете с -pedantic на g++, вы фактически получите ISO C++ forbids zero-size array. Также актуально: stackoverflow.com/a/10353341/234175   -  person greatwolf    schedule 24.12.2014
comment
@greatwolf - Вот и все! Не использовал -pedantic, потому что быстро протестировал его на ideone.com. Спасибо!   -  person Mark    schedule 24.12.2014
comment
Я ожидаю, что цель этой перегрузки — просто предоставить унифицированный интерфейс контейнера, то есть сделать массивы пригодными для использования с std::empty, как и с любым другим контейнером.   -  person cdhowie    schedule 24.12.2014
comment
Действительно, цель ясна, я просто запутался в упомянутом пункте.   -  person Mark    schedule 24.12.2014


Ответы (1)


Он всегда будет возвращать false просто потому, что массивы не могут быть объявлены содержащими нулевые элементы. Из стандарта С++ 11 (у меня нет более позднего стандарта, и я не ожидаю, что он все равно изменится):

В объявлении T D, где D имеет вид

D1 [ константное-выражениеopt ] определитель-атрибута-seqopt

... Если присутствует константное-выражение, оно должно быть интегральным константным выражением, и его значение должно быть больше нуля. - §8.3.4 [dcl.массив]

Поэтому эта перегрузка всегда будет возвращать true в соответствующей реализации.

person cdhowie    schedule 24.12.2014