首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >固定大小和零初始化数组作为C++11中的默认参数

固定大小和零初始化数组作为C++11中的默认参数
EN

Stack Overflow用户
提问于 2018-02-10 09:58:25
回答 1查看 1K关注 0票数 0

上下文:i认为使用compile: g++ -std=c++11 main.cpp编译的以下SSCCE将零初始化一个固定大小的数组arr

代码语言:javascript
复制
void foo(int arr[4] = {0}) { }

int main(int argc, char const *argv[]) {
    foo();
    return 0;
}

但是,我使用gdb进行了调试,发现arr = 0x0 (null)。我(疯狂地)猜测这是因为int arr[4]非常类似于int* arr,但另外告诉编译器只允许长度为4的数组。因此,实际上发生的是int arr* = {0} ie,我只是使用初始化程序列表对指针进行零初始化。

我知道我可以通过恢复使用重载而不是默认参数来避免这个问题:

代码语言:javascript
复制
void foo(int arr[4]) { }

void foo() {
    int arr[4] = {0};
    foo(arr);
}

这确实给了我一个在foo中初始化为零的固定大小数组,就像预期的那样。不过,我认为最好使用一些默认参数(类似于SSCCE )将这两个重载函数合并为一个函数。

问题:默认参数的零初始化在C++11中可以固定大小的数组吗?如果可以,如何实现?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-10 11:02:23

您遇到的主要问题是void foo(int arr[4])会退化为void foo(int* arr),因此您的函数确实接受指针而不是数组。简单的证明是,foo(nullptr);编译时不会出现错误或警告。

因此,声明void foo(int arr[4] = {0});实际上是void foo(int* arr = {0});,它初始化指向0的指针(试图将{0}更改为任何其他数字实际上会导致编译时错误)。

最好的选择是最有可能使用std::array,例如:

代码语言:javascript
复制
#include <array>

void foo(std::array<int, 4> arr = {0}) { }

int main(int argc, char const *argv[]) {
    foo();
    // call with an array
    foo({1,2,3,4});
    // providing more values will cause a compile time error
    // foo({2,3,4,5,6,7,8});
    return 0;  
}

请注意,目前还没有方便的方法将“原始”C样式数组转换为std::array,尽管在experimental/array中有一个名为std::to_array的辅助函数,可以在将来的版本中合并到标准中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48719465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档