Возвращаемое значение нечленов перегрузки 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;

1

Решение

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

В декларации T D где D имеет форму

    D1 [ константа-выражениевыбирать ] Атрибут спецификатор-слвыбирать

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

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

4

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