为什么std :: array< T,0>不是空的?

时间:2013-03-20 00:00:45

标签: c++ c++11 language-lawyer

鉴于任何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确实产生了true

问题:为什么这样,因为0已经是std::array的特殊情况?这是标准的故意还是疏忽?

1 个答案:

答案 0 :(得分:21)

该标准没有说明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