Есть замечания, указывающие правильные возвращаемые значения для каждой из новых функций, не являющихся членами, и, в частности, std::empty
перегрузка для массивов фиксированного размера меня смущает. В документе предполагается, что возвращаемое значение для этой перегрузки всегда будет false
; тот все массивы фиксированного размера никогда не будут пустыми.
Почему это так? Насколько мне известно, возможно (хотя, возможно, бесполезно) иметь массив нулевого размера, как в int x[0];
, который я бы назвал пустым.
Для справки, конкретная перегрузка, о которой я говорю:
template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept;
Он всегда будет возвращать false просто потому, что нельзя объявить, что массивы содержат нулевые элементы. Из стандарта C ++ 11 (у меня нет более удобного стандарта, и я не думаю, что это все равно изменится):
В декларации
T D
гдеD
имеет форму
D1 [
константа-выражениевыбирать]
Атрибут спецификатор-слвыбирать… Если константа-выражение присутствует, оно должно быть интегральным постоянным выражением, и его значение должно быть больше нуля. — §8.3.4 [dcl.array]
Поэтому эта перегрузка всегда будет возвращать true в соответствующей реализации.