鉴于任何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
的特殊情况?这是标准的故意还是疏忽?
答案 0 :(得分:21)
该标准没有说明tuple
或array
是否为空,您看到的是实施细节,但没有理由让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
)