声明带有聚合初始化器的空c++数组
Declaring empty C++ array with aggregate initializer
在c++中,与C语言不同,空数组T name[]
是非法的,
声明的类型为"T的未知界数组",是一种不完全类型。
但是,当
在带有聚合初始化项的声明中使用
如T name[] = {val1, val2, ...}
,其中数组被分配初始化列表中的元素个数。
当聚合初始化器为空时,预期的行为是什么?T name[] = {}
我测试了g++(版本4.8.4)和clang(版本3.4),它们都没有给出任何错误或警告,并且似乎分配了1个元素。这是定义的行为吗?文档吗?
int a[] = {};
int b[] = {};
结果:
a[0] -> 0x7ffc3de28dd8
a[1] -> 0x7ffc3de28ddc
b[0] -> 0x7ffc3de28ddc
b[1] -> 0x7ffc3de28de0
来自工作草案,[8.5.1/5]( aggregate ):
一个空的初始化列表{}不能用作未知边界数组的初始化子句。
参见[footnote/105]:
语法提供了空的初始化列表,但是c++没有零长度数组。
听起来像UB。
还请注意,这将按预期编译:
template<int N>
void f(int(&)[N]) { }
int main() {
int v[] = {42};
f(v);
}
但是如果你使用:
它就不起作用了int v[] = {};
根据c++标准1.8.6 (c++ 14):
两个不是位域的对象可以有相同的地址是另一个的子对象,还是至少有一个是基类零大小的子对象,它们是不同类型的;否则,它们应当有不同的地址。4
编译器必须分配数组的至少一个元素来满足上述要求。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '