考慮下面的代碼段,這是通過C++編譯器11完全可以接受的:在C++ 11中是否存在零大小的std :: array的原因?
#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-speci fi cation相當於noexcept(true)
。
如上顯示,零尺寸std::array
s爲在C++ 11完全允許的,相反具有零門尺寸的陣列(例如,int A[0];
)在那裏它們被明確禁止的,但它們是由一些編譯器允許(例如, GCC)以未定義的行爲爲代價。
考慮到這個「矛盾」,我有以下問題:
爲什麼C++委員會決定允許零大小
std::array
S'有沒有什麼有價值的用途?我能想到的
可能與容器一致,並使一些通用的東西更容易。 – chris
一個可能的考慮是,即使任何實現對零大小的數組都有困難,他們也應該對'std :: array'進行部分特化。 –
hvd
模板元程序通常是遞歸的,遞歸最低限度爲0而不是1 ...但我承認我在這種情況下構建一個實際的示例時遇到了問題 – Nemo