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
答案 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::array
。 std::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的回答。