Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::大小为零的数组_C++_Stdarray - Fatal编程技术网

C++ std::大小为零的数组

C++ std::大小为零的数组,c++,stdarray,C++,Stdarray,拥有std::array,大小为零的数组意味着什么 在发布这篇文章之前,我在SO中也遇到过类似的问题 问题是关于简单数组类型和C语言,大多数人说这是非法的。但是在C++ 允许数组。< /P> 根据cppreference.com 零长度数组(N==0)有一种特殊情况。在这种情况下,array.begin()==array.end(),这是一个唯一的值。在零大小数组上调用front()或back()的效果未定义 为什么它不被定义为非法 有std::array,大小为零的数组意味着什么 例如,与空的

拥有
std::array
,大小为零的数组意味着什么

在发布这篇文章之前,我在SO中也遇到过类似的问题 问题是关于简单数组类型和C语言,大多数人说这是非法的。但是在C++ <代码>允许数组。< /P> 根据cppreference.com

零长度数组(N==0)有一种特殊情况。在这种情况下,
array.begin()==array.end()
,这是一个唯一的值。在零大小数组上调用
front()
back()
的效果未定义

为什么它不被定义为非法

有std::array,大小为零的数组意味着什么

例如,与空的
std::vector
或空的
std::set
相同

为什么它不被定义为非法

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

由于模板专业化,可以将其定义为合法。例如,VisualC++中实现的代码“代码> STD::数组< /代码>的方式与以下类似:

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
};
模板
类数组//专业化
{
// ...
大小\类型大小()常量
{
返回0;
}
T元素[1];//原始数组的大小不能为0
};

我假设每个编译器都实现了类似的
std::array

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

因为模板化代码可以利用类似的功能。为什么它是非法的?如果我不得不在代码中添加特殊情况以避免零大小的数组,而不是让
array
以明显的方式处理这种情况,我会非常恼火。@MikeSeymour
intx[0]是非法的。我想问题是为什么会有这样的区别?多么不必要的重复,我们有条件运算符。这是一个相当令人惊讶的实现。当我请求一个零数组时,默认构造一个
T
是…odd.Hmm,libc++也做同样的事情。libstdc++没有,但可以说在处理零大小数组的
begin()
等时调用UB。@t.C:
begin()
对于零大小数组来说是未定义的行为。哎呀,当然不是。我的意思是前面。很抱歉给你带来了困惑。