std::array 大小为零
std::array of size zero
std::array<int,0>
,大小为零的数组是什么意思?
在发布之前,我已经在 SO 中解决了类似的问题,所有这些
问题是关于简单数组类型和 C 语言的,他们中的大多数人说这是非法的。但在 C++ 中 array<int,0>
是允许的。
根据 cppreference.com
There is a special case for a zero-length array (N == 0). In that case, array.begin() == array.end()
, which is some unique value. The effect of calling front()
or back()
on a zero-sized array is undefined.
为什么不定义为非法?
What does it mean to have std::array,array of size zero?
与例如空 std::vector
或空 std::set
相同。
Why isn't it defined as illegal?
希望使其合法,因为这意味着泛型编程不必处理特殊情况 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
。
std::array 被认为与其他可以为空的标准容器一样。所以 N 等于零的 std::array
的特化定义了一个空容器。
std::array<int,0>
,大小为零的数组是什么意思?
在发布之前,我已经在 SO 中解决了类似的问题,所有这些
问题是关于简单数组类型和 C 语言的,他们中的大多数人说这是非法的。但在 C++ 中 array<int,0>
是允许的。
根据 cppreference.com
There is a special case for a zero-length array (N == 0). In that case,
array.begin() == array.end()
, which is some unique value. The effect of callingfront()
orback()
on a zero-sized array is undefined.
为什么不定义为非法?
What does it mean to have std::array,array of size zero?
与例如空 std::vector
或空 std::set
相同。
Why isn't it defined as illegal?
希望使其合法,因为这意味着泛型编程不必处理特殊情况 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
。
std::array 被认为与其他可以为空的标准容器一样。所以 N 等于零的 std::array
的特化定义了一个空容器。