2015-03-08 49 views
6

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

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

作为每cppreference.com

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

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

+7

因为模板化代码可以从这样的事情中获益。 – sbabbi 2015-03-08 16:56:15

+2

为什么它应该是非法的?如果我不得不向我的代码添加特殊情况以避免零大小的数组,而不是让'array'以明显的方式处理这种情况,我会感到非常恼火。 – 2015-03-08 16:59:30

+0

@MikeSeymour'int x [0];'*是*非法。我想问题是为什么差异。 – Angew 2015-03-08 17:03:09

回答

9

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 
}; 

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

+0

像这样的模板专业化?什么不必要的重复,我们有条件操作符。 – Deduplicator 2015-03-08 17:13:20

+2

这是一个相当令人惊讶的实现。当我要求一个零“T”的数组时,默认构造一个“T”是......奇怪的。 – 2015-03-08 17:13:56

+0

@ T.C:好吧,它直接从真正的VC头文件中取出... – 2015-03-08 17:14:32

2

std :: array被认为是可以为空的其他标准容器。因此,N等于零的std::array的专门化定义了一个空容器。

+0

顺便说一句,它是*从来没有*一个空的类型,虽然... – Deduplicator 2015-03-08 17:12:22