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
该标准并没有说是否什么tuple或array应该是空的,你看到的是实施细节,但没有理由让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)
| 归档时间: |
|
| 查看次数: |
1459 次 |
| 最近记录: |