101*_*010 41 c++ arrays c++11 stdarray c++14
考虑以下代码片段,这是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;
}
Run Code Online (Sandbox Code Playgroud)
根据标准§23.3.2.8[ 零大小的阵列 ]:
1数组应为特殊情况提供支持N == 0.
2在这种情况下N == 0,begin() == end() ==独特的价值.返回值
data()未指定.
3调用front()或back()零大小数组的效果是未定义的.
4成员函数swap()应具有等效的noexcept-speci fi cationnoexcept(true).
如上所示,零大小的std::arrays在C++ 11中是完全允许的,与零大小的数组(例如int A[0];)相比,它们被明确禁止,但是一些编译器(例如,GCC)允许它们以未定义的行为为代价. .
考虑到这种"矛盾",我有以下问题:
为什么C++委员会决定允许零大小的std::arrays?
有什么有价值的用途吗?
sth*_*sth 43
如果你有一个泛型函数,那么如果该函数随机中断特殊参数就不好了.例如,假设你可以有一个模板函数,它将N随机元素形成一个向量:
template<typename T, size_t N>
std::array<T, N> choose(const std::vector<T> &v) {
...
}
Run Code Online (Sandbox Code Playgroud)
如果N由于某种原因导致未定义的行为或编译器错误,则无法获得任何结果.
对于原始数组,限制背后的原因是你不需要类型sizeof T == 0,这会导致与指针算法结合的奇怪效果.如果不为其添加任何特殊规则,则具有零元素的数组的大小为零.
但是std::array<>是一个类,并且类的大小总是> 0.所以你不会遇到这些问题std::array<>,并且一个没有任意限制模板参数的一致接口是可取的.