作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下矩阵类:
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/
我是一名优秀的程序员,十分优秀!