C++ 在另一个数组中使用固定大小的数组初始化列表

C++ 在另一个数组中使用固定大小的数组初始化列表,c++,arrays,templates,initialization,C++,Arrays,Templates,Initialization,我试着做到以下几点: template <typename T, int N> struct Vector { T v[N]; template<typename... Args> Vector(Args... args) : v { args... } {} template<typename S> Vector(Vector<S, N> const & V) : v {V.v} {} }; int main() { Ve

我试着做到以下几点:

template <typename T, int N>
struct Vector {
  T v[N];
  template<typename... Args> Vector(Args... args) : v { args... } {}
  template<typename S> Vector(Vector<S, N> const & V) : v {V.v} {}
};
int main() {
  Vector<float, 4> V (1.0f, 2.0f, 3.0f, 4.0f);
  Vector<float, 4> V2 (V);
  for (auto f : V2.v) { cout << f << ", "; } cout << endl;
  return 0;
}
或将其用于:

  Vector(Vector const & V) : v {V.v} {}
  Vector<double, 4> V2 (V);
编辑说:

错误:无法在初始化中将“常量浮点*”转换为“浮点”

或与“double”相同

在那之后,我尝试了简单的数组,但失败了,出现了相同的错误,但是有了足够的模板,它就可以工作了


有人能解释一下这里发生了什么吗?

你不能用另一个数组初始化一个数组

不,它也不能使用模板复制构造函数,下面的代码片段只给出了相同的错误消息

template <class T, int N>
struct Vector2 {
  T vv[N];
};

template <typename T, int N>
struct Vector {
  T v[N];
  template<typename T1>
  Vector(const Vector2<T1, N> & V) : v{V.vv} {}
};

int main() {
  Vector2<float, 4> V2;
  Vector<float, 4> V1(V2);

  return 0;
}
代码段工作的原因是编译器使用了隐式声明的复制构造函数。如果显式地将其声明为deleted或private成员,您将发现编译器甚至没有尝试实例化模板复制构造函数,我不知道为什么

我发现V.V总是衰减到指针,即使我试图用reinterpret_cast将它转换到T&[N]*重新解释

所以。。。我试图找出答案,但这只会引出更多的问题


解决方法是将数组包装到类中。

您不能分配数组,您需要循环复制它们的元素。这与您不能编写v1.v=v2.v的原因相同;停止使用哑数组,使用std::array。这实际上与使用数组是一样的,没有您现在看到的所有陷阱,很好,谢谢,但是我想解释一下为什么它可以使用额外的模板。另外,请注意,我认为带有引用成员的类是不可复制的未定义行为,所以我永远不会这样做,尽管有时这很诱人。@elad不要担心引用,如果要使用隐式复制控件成员,可以将其删除。如果要保留引用,只需定义自己的复制控件成员。