gpt4 book ai didi

c++ - 如何在 constexpr 构造函数中初始化矩阵 ONCE?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:23 25 4
gpt4 key购买 nike

我有以下矩阵类:

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]);
}
};

用法:

constexpr auto m = matrix({
{4.3f, 5.0f, 1.2f},
{8.0f, 1.9f, 6.5f},
{9.1f, 2.2f, 3.7f},
});

This compiles (在 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]);
}

最佳答案

P1331 (允许在 constexpr 上下文中进行简单的默认初始化)被 C++20 采用。它删除了以下要求:

every non-variant non-static data member and base class subobject shall be initialized

这就是要求您进行 : 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]);
}
};

不再需要初始化data

关于c++ - 如何在 constexpr 构造函数中初始化矩阵 ONCE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57807483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com