std::array 大小为零

std::array of size zero

std::array<int,0>,大小为零的数组是什么意思?

在发布之前,我已经在 SO 中解决了类似的问题,所有这些 问题是关于简单数组类型和 C 语言的,他们中的大多数人说这是非法的。但在 C++ 中 array<int,0> 是允许的。

根据 cppreference.com

There is a special case for a zero-length array (N == 0). In that case, array.begin() == array.end(), which is some unique value. The effect of calling front() or back() on a zero-sized array is undefined.

为什么不定义为非法?

What does it mean to have std::array,array of size zero?

与例如空 std::vector 或空 std::set 相同。

Why isn't it defined as illegal?

希望使其合法,因为这意味着泛型编程不必处理特殊情况 std::array的大小是编译时计算的结果。

由于模板专门化,可能将其定义为合法的。例如,Visual C++ 附带的实现以类似于以下的方式专门化 std::array

template<class T>
class array<T, 0> // specialisation
{
    // ...

    size_type size() const
    {
        return 0;
    }

    T elements[1]; // the raw array cannot have a size of 0
};

我想每个编译器都这样实现 std::array

std::array 被认为与其他可以为空的标准容器一样。所以 N 等于零的 std::array 的特化定义了一个空容器。