gpt4 book ai didi

c++ - 在 C++11 中有零大小的 std::array 的原因吗?

转载 作者:IT老高 更新时间:2023-10-28 14:02:14 25 4
gpt4 key购买 nike

考虑以下一段代码,它完全可以被 C++11 编译器接受:

#include <array>
#include <iostream>

auto main() -> int {
std::array<double, 0> A;

for(auto i : A) std::cout << i << std::endl;

return 0;
}

根据标准 § 23.3.2.8 [零大小数组]:

1 Array shall provide support for the special case N == 0.

2 In the case that N == 0, begin() == end() == unique value. The return value of
data() is unspecified.

3 The effect of calling front() or back() for a zero-sized array is undefined.

4 Member function swap() shall have a noexcept-specification which is equivalent to noexcept(true).

如上所示,与零大小数组(例如,int A[0];),它们被明确禁止,但某些编译器(例如,GCC)允许它们以未定义行为为代价。

考虑到这个“矛盾”,我有以下问题:

  • 为什么 C++ 委员会决定允许零大小的 std::arrays?

  • 有什么有值(value)的用途吗?

最佳答案

如果你有一个泛型函数,如果该函数随机中断特殊参数,那就不好了。例如,假设您可以有一个模板函数,它采用 N随机元素组成一个 vector :

template<typename T, size_t N>
std::array<T, N> choose(const std::vector<T> &v) {
...
}

如果 N 导致未定义的行为或编译器错误,则什么也得不到。由于某种原因结果为零。

对于原始数组,限制背后的原因是您不希望类型具有 sizeof T == 0 ,这会导致与指针运算结合使用的奇怪效果。如果您不为其添加任何特殊规则,则具有零元素的数组的大小将为零。

但是std::array<>是一个类,并且类的大小总是 > 0。所以 std::array<> 不会遇到这些问题。 ,最好是没有模板参数任意限制的一致接口(interface)。

关于c++ - 在 C++11 中有零大小的 std::array 的原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24152435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com