考虑以下一段代码,它完全可以被 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?有什么有价值的用途吗?