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

Dan*_*rey 21 c++ language-lawyer c++11

鉴于此std::array< T, 0 >,为什么它不是空的?我的意思是"空",如:

 std::is_empty< std::array< int, 0 > >::value
Run Code Online (Sandbox Code Playgroud)

回来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;
 }
Run Code Online (Sandbox Code Playgroud)

产量

 4
 4
 8
Run Code Online (Sandbox Code Playgroud)

这意味着,std::array<int,0>没有应用空基础优化(EBO).

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

问题:为什么这样,因为这个尺寸0已经是一个特例了std::array?这是标准的故意还是疏忽?

Jon*_*ely 21

该标准并没有说是否什么tuplearray应该是空的,你看到的是实施细节,但没有理由让tuple<>非空,而有一个很好的理由array<T, 0>是非空的,可以考虑:

std::array<int, sizeof...(values)> = { { values... } };
Run Code Online (Sandbox Code Playgroud)

当参数包为空时你会得到:

std::array<int, 0> = { { } };
Run Code Online (Sandbox Code Playgroud)

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

一个实现没有特殊情况整个数组,它只能做:

T m_data[N == 0 ? 1 : N];
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,我忘了它改为GCC 4.8允许零大小的非DefaultConstructible类型数组,请参阅http://gcc.gnu.org/PR53248(当gcc.gnu.org重新联机时).它现在有一个空结构成员而不是`value_type [1]`. (5认同)