std :: size的大小为零的数组

InQ*_*ive 7 c++ stdarray

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

在发布之前我已经在SO中经历了类似的问题,所有这些问题都是关于简单的数组类型和C语言,并且大多数人都认为这是非法的.但是在C++中array<int,0>是允许的.

根据cppreference.com

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

为什么不将它定义为非法?

Chr*_*ckl 11

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

与例如空std::vector或空相同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
};
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个相当令人惊讶的实现.当我要求零"T"数组时,默认构造一个`T`是......奇数. (2认同)