24

给定 any std::array< T, 0 >,为什么它不是空的?我的意思是“空”,如:

 std::is_empty< std::array< int, 0 > >::value

返回false

 #include <iostream>
 #include <tuple>
 #include <array>

 struct Empty {};

 int main()
 {
     std::cout << sizeof(std::tuple<int>) << std::endl;
     std::cout << sizeof(std::tuple<int,Empty>) << std::endl;
     std::cout << sizeof(std::tuple<int,std::array<int,0>>) << std::endl;
 }

产量

 4
 4
 8

这意味着,对于std::array<int,0>,不应用空基优化 (EBO)。

这对我来说似乎特别奇怪,因为std::tuple<>(注意:没有模板参数)空的,即std::is_empty<std::tuple<>>::value确实 yield true

问题:为什么会这样,因为 size0已经是 的特例了std::array?是故意的还是标准的疏忽?

4

1 回答 1

25

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

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

当参数包为空时,您将得到:

std::array<int, 0> = { { } };

为了使初始化程序有效,对象需要一个成员,这不可能是int[0]因为您不能将零大小的数组作为成员,因此可能的实现是int[1]

实现不必对整个数组进行特殊处理,它可以这样做:

T m_data[N == 0 ? 1 : N];

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

于 2013-03-20T00:10:10.427 回答