将具有固定大小的数组传递给struct

时间:2017-12-29 20:19:37

标签: 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;
}

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

你知道为什么这段代码不能编译吗?

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++,正在使用

进行编译和运行
 g++ -std=c++17 main.cpp kdtree.h kdtree.cpp && ./a.out

4 个答案:

答案 0 :(得分:7)

无法复制数组。

int a[3];
int b[3];
a = b; // illegal

此外,当您将数组传递给函数时,其名称会衰减为指针,因此S(double arr[1])等同于S(double* arr)。一旦你进入函数,你必须复制单个元素,所以你还需要数组的大小:

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

如果将模板编写为函数,则可以省略大小:

template <std::size_t sz)
S(double (&x)[sz]) {
    std::copy_n(x, sz, arr);
}

或者,更好的是,使用std::array,它可以按您期望的方式工作。

答案 1 :(得分:6)

  

你知道为什么这段代码不能编译吗?

它不会被编译,因为数组不能被复制初始化(除了copy-list-initialized,但是你没有这样做)。

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

或者,您可以使用C ++ 11中引入的std::arraystd::array是可复制的。

答案 2 :(得分:3)

你不能。您可以做的是改为使用std::array包装器:

struct S {
    std::array<double, 1> arr;
    S(std::array<double, 1> arr) : arr(arr) {}
};

答案 3 :(得分:3)

虽然构造函数的签名是这样编写的,但是数组类型被调整为指针,array argument decays指向指向其第一个元素的指针。

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

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