8

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

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

根据 cppreference.com

零长度数组(N == 0)有一种特殊情况。在这种情况下,array.begin() == array.end(),这是一些独特的价值。调用front()orback()对大小为零的数组的影响是未定义的。

为什么不定义为非法?

4

2 回答 2

11

std::array,array 的大小为零是什么意思?

与例如 emptystd::vector或 empty相同std::set

为什么不定义为非法?

使其合法是可取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的。

于 2015-03-08T17:03:45.537 回答
2

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

于 2015-03-08T17:05:49.940 回答