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
以明显的方式处理这种情况,我会非常恼火。@MikeSeymourintx[0]代码>是非法的。我想问题是为什么会有这样的区别?多么不必要的重复,我们有条件运算符。这是一个相当令人惊讶的实现。当我请求一个零数组时,默认构造一个T
是…odd.Hmm,libc++也做同样的事情。libstdc++没有,但可以说在处理零大小数组的begin()
等时调用UB。@t.C:begin()
对于零大小数组来说是未定义的行为。哎呀,当然不是。我的意思是前面。很抱歉给你带来了困惑。