C++ 为什么std::array<;T、 0>;不是空的吗?

C++ 为什么std::array<;T、 0>;不是空的吗?,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,给定任何std::array,为什么它不是空的?我的意思是“空的”,如: 屈服 4 4 8 这意味着,对于std::array,不应用空基优化(EBO) 考虑到std::tuple(注意:没有模板参数)是空的,也就是说,std::is_empty::value会产生true,这对我来说似乎特别奇怪 问题:既然大小0已经是std::array的特例,为什么会这样?这是故意的还是标准中的疏忽?标准没有说明tuple或array是否应该为空,您看到的是实现细节,但没有理由将tuple设为非空,

给定任何
std::array
,为什么它不是空的?我的意思是“空的”,如:

屈服

 4
 4
 8
这意味着,对于
std::array
,不应用空基优化(EBO)

考虑到
std::tuple
(注意:没有模板参数)是空的,也就是说,
std::is_empty::value
会产生
true
,这对我来说似乎特别奇怪


问题:既然大小
0
已经是
std::array
的特例,为什么会这样?这是故意的还是标准中的疏忽?

标准没有说明
tuple
array
是否应该为空,您看到的是实现细节,但没有理由将
tuple
设为非空,而
array
设为非空是有充分理由的,考虑:

std::array<int, sizeof...(values)> = { { values... } };

所有其他成员的工作方式都完全相同(假设
end()
被定义为
begin()+N

GCC4.8的工作方式似乎有所不同(或者它附带的libstdc++),因为
sizeof(std::array)==1
。但我知道你说了“一个可能的实现”,我接受这个理由,所以谢谢!GCC没有
value_type_M_实例[_Nm?_Nm:1]我在LiveWorkSpace.org上看到GCC4.8的
sizeof(array)==sizeof(int)
我看到了
sizeof(std::array)==1
。奇怪。啊,是的,我忘了GCC4.8允许非默认可构造类型的零大小数组,请参阅(当GCC.gnu.org重新联机时)。它现在有一个空的结构成员,而不是
value\u type[1]
。我刚刚从标准中找到了§23.3.2.1/2。这难道不意味着它不仅仅是一个实现细节,而且标准确实说明了
std::array
的空性(尽管是间接的)?因此,如果我读对了,空的实现甚至是非法的,不是吗?
 4
 4
 8
std::array<int, sizeof...(values)> = { { values... } };
std::array<int, 0> = { { } };
T m_data[N == 0 ? 1 : N];