Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将固定大小的数组传递给结构_C++ - Fatal编程技术网

C++ 将固定大小的数组传递给结构

C++ 将固定大小的数组传递给结构,c++,C++,您好,这是我在代码中遇到的一个提取问题 你知道为什么这段代码无法编译吗 struct S { double arr[1]; S(double arr[1]) : arr(arr) {} }; int main(void) { double arr[1] = {1.2}; S p(arr); return 0; } 我正在使用g++,编译并运行 main.cpp: In constructor ‘S::S(double*)’: main.cpp:26:2

您好,这是我在代码中遇到的一个提取问题

你知道为什么这段代码无法编译吗

struct S {
    double arr[1];
    S(double arr[1]) : arr(arr) {}
};

int main(void) {
    double arr[1] = {1.2};
    S p(arr);
    return 0;
}
我正在使用
g++
,编译并运行

main.cpp: In constructor ‘S::S(double*)’:
main.cpp:26:28: error: incompatible types in assignment of ‘double*’ to ‘double [1]’
  S(double arr[1]) : arr(arr) {}

你不能。您可以使用包装器来代替:

 g++ -std=c++17 main.cpp kdtree.h kdtree.cpp && ./a.out
结构{
std::阵列arr;
数组arr:arr(arr){}
};
你知道为什么这段代码无法编译吗

struct S {
    double arr[1];
    S(double arr[1]) : arr(arr) {}
};

int main(void) {
    double arr[1] = {1.2};
    S p(arr);
    return 0;
}
它不会编译,因为数组不能被复制初始化(复制列表初始化除外,但您没有这样做)

数组必须使用循环一次复制一个元素。还有一个标准的复制算法,所以您不需要自己编写循环:
std::copy


或者,您可以使用C++11中引入的
std::array
<代码>标准::数组可复制。

无法复制数组

struct S {
    std::array<double, 1> arr;
    S(std::array<double, 1> arr) : arr(arr) {}
};
此外,当您将数组传递给函数时,其名称将衰减为指针,因此
S(double-arr[1])
相当于
S(double-arr)
。进入函数后,必须复制单个元素,因此还需要数组的大小:

int a[3];
int b[3];
a = b; // illegal
如果将模板作为函数写入,则可以忽略大小:

S(double *x, std::size_t sz) {
    std::copy_n(x, sz, arr);
}

template尽管构造函数的签名是这样写的,但数组类型被调整为指针,数组类型被调整为指向其第一个元素的指针

但是,结构中的arr成员仍然是array类型。并且指针不能分配给数组(因此出现错误)


也不可能将一个数组分配给另一个数组(例如,即使您将其更改为上述链接中描述的方式之一),因此您需要使用循环手动复制元素,或使用
std::copy
,或使用
std::array
,如Ron的回答中所述。

您使用的编译器是什么?@Mad Physical Hi,g++。这是我使用的命令:g++-std=c++17 main.cpp kdtree.h kdtree.cpp&./a.out这里有一个IDEOne链接:。我独立地做了同样的编辑。我用相关信息编辑了你的问题。一般来说,不要回复任何可能与评论相关的内容。换言之,我不知道答案是什么,但我很想知道答案+谢谢!现在明白了。使用数组包装器会导致性能损失吗?@DanZilberman不会。在签名中,它被强制为POD(即使某些MSVC(库)版本未能将其报告为AFAIR),数组类型被调整为指针。调用函数时,将数组传递给这样的函数(或将数组名分配给指针的任何情况)时,会发生衰减。@juanchopanza-Hmm。这样更好吗?