上下文:i认为使用compile: g++ -std=c++11 main.cpp编译的以下SSCCE将零初始化一个固定大小的数组arr
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,我只是使用初始化程序列表对指针进行零初始化。
我知道我可以通过恢复使用重载而不是默认参数来避免这个问题:
void foo(int arr[4]) { }
void foo() {
int arr[4] = {0};
foo(arr);
}这确实给了我一个在foo中初始化为零的固定大小数组,就像预期的那样。不过,我认为最好使用一些默认参数(类似于SSCCE )将这两个重载函数合并为一个函数。
问题:默认参数的零初始化在C++11中可以固定大小的数组吗?如果可以,如何实现?
发布于 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,例如:
#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的辅助函数,可以在将来的版本中合并到标准中。
https://stackoverflow.com/questions/48719465
复制相似问题