4 回答
普通 C 样式数组不可分配。如果您改用使用std::array
,则初始化变得微不足道。
#include <array>
struct Vector
{
std::array<float, 3> v;
Vector(std::array<float, 3> const& values)
: v(values)
{}
};
int main()
{
Vector v{{1, 2, 3}};
}
如果你的类是一个聚合,你可以使用你的语法
template < std::size_t len >
struct Vector
{
float elems[len];
};
Vector<3> v = {1.0f, 2.0f, 3.0f};
注意:由于大括号省略,这是可能的。不需要,v = {{1,2,3}};
尽管这也是可能的。v
Clang 发出此警告是因为使用双大括号(一个用于初始化,一个用于初始化 sub-aggregate elems
)的语法更清晰且不易出错。
如果您的类不是聚合类,则可以使用可变参数模板:
#include <array>
#include <cstddef>
template < std::size_t len >
struct Vector
{
std::array < float, len > m; // also works with raw array `float m[len];`
template < typename... TT >
Vector(TT... pp) : m{{pp...}}
{}
// better, using perfect forwarding:
// template < typename... TT >
// Vector(TT&&... pp) : m{{std::forward<TT>(pp)...}}
// {}
};
Vector<3> a = {1.0f, 2.0f, 3.0f};
尝试使用std::copy
.
Vector(std::initializer_list<float> values)
{
std::copy(values.begin(), values.end(), v);
}
要初始化数组非静态成员,请使用聚合语法。也就是说,直接用N
元素填充花括号列表,其中N是数组中的元素数。如果元素类型是 Default-Constructible,则可以使用少于N的值;缺失的元素将被初始化。
没有从 astd::initializer_list
到数组的转换。即使您使用的源类型可以转换为数组引用(绝不是值),您也无法利用成员初始化程序中的转换,因为数组不是可赋值的。在这些情况下,您必须std::copy
在构造函数的主体中使用类似的东西。
注意多维数组,因为数组不是可赋值的,你只能使用花括号列表来表示子数组。还有大括号省略的选项;使用一个平面的std::remove_all_extents<TheArrayType>::type
项目列表,编译器将完成。(当内部非数组类型是内置字符类型时,您有时可以使用带引号的字符串作为多维数组的倒数第二个初始值设定项。)