考虑以下一段代码,它完全可以被 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
数组应为特殊情况提供支持N == 0
。
2
在这种情况下N == 0
,begin() == end() ==
独特的价值。的返回值
data()
未指定。
3
调用front()
或back()
对零大小数组的影响是未定义的。
4
成员函数swap()
应该有一个 noexcept 规范,它等价于noexcept(true)
.
如上所示,零大小std::array
的 s 在 C++11 中是完全允许的,与零大小的数组(例如,int A[0];
)相反,它们被明确禁止,但某些编译器(例如,GCC)以未定义行为为代价允许它们.
考虑到这种“矛盾”,我有以下问题:
为什么 C++ 委员会决定允许零大小
std::array
的 s?有什么有价值的用途吗?