我有以下矩阵类:
template<size_t Rows, size_t Cols>
class matrix
{
float data[Rows][Cols];
public:
constexpr matrix(const float (&input)[Rows][Cols]) : data{}
{
for (size_t i = 0; i < Rows; ++i)
std::copy(input[i], input[i] + Cols, data[i]);
}
};
Run Code Online (Sandbox Code Playgroud)
用法:
constexpr auto m = matrix({
{4.3f, 5.0f, 1.2f},
{8.0f, 1.9f, 6.5f},
{9.1f, 2.2f, 3.7f},
});
Run Code Online (Sandbox Code Playgroud)
这可以编译(在C ++ 20中)并且可以正常工作,但是需要初始化data两次。第一个data{}是必需的,因为所有内容都必须在constexpr构造函数中进行成员初始化,而第二个则复制实际输入。
在编译时初始化两次无关紧要,但这也意味着该构造函数无法在运行时使用,因为它不必要地将同一数据初始化两次。
有什么等效于此伪代码的吗?
constexpr matrix(const float (&input)[Rows][Cols])
{
for (size_t i = 0; i < Rows; ++i)
std::constexpr_uninitialized_copy(input[i], input[i] + Cols, data[i]);
}
Run Code Online (Sandbox Code Playgroud)
C ++ 20采用了P1331(在constexpr上下文中允许微不足道的默认初始化)。它删除了以下要求:
每个非变量非静态数据成员和基类子对象都应初始化
这就是要求您进行: data {}初始化的原因。
这应该工作:
template<size_t Rows, size_t Cols>
class matrix
{
float data[Rows][Cols];
public:
constexpr matrix(const float (&input)[Rows][Cols])
{
for (size_t i = 0; i < Rows; ++i)
std::copy(input[i], input[i] + Cols, data[i]);
}
};
Run Code Online (Sandbox Code Playgroud)
无需初始化data。