小编sea*_*lus的帖子

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

我有以下矩阵类:

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, …
Run Code Online (Sandbox Code Playgroud)

c++ c++20

8
推荐指数
1
解决办法
112
查看次数

如果 constexpr 和相关的 false static_assert 格式不正确?

相关的问题提供了一种类型无关的例子falsestatic_assert

template<class T> void foo()
{
    if constexpr(false)
        static_assert(false);
}
Run Code Online (Sandbox Code Playgroud)

但是,我更担心同样的事情是否适用于依赖于类型的false. 这是标准中的相关引用:

如果不能为模板或模板中的 constexpr if 语句的子语句生成有效的特化,并且模板未实例化,则程序格式错误,无需诊断§ 13.7/8.1

这让我感到惊讶,因为我经常看到以下习语:

template<class T> void foo()
{
    if constexpr(cond)
        // ...
    else
        static_assert(!std::is_same_v<T, T>);
}
Run Code Online (Sandbox Code Playgroud)

事实上,cppreference 甚至提供了一个同样的例子

template<class T> struct dependent_false : std::false_type {};
template<class T> void foo()
{
    if constexpr (cond)
        // ...
    else
        static_assert(dependent_false<T>::value);
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,在这两种情况下,都无法为相关if constexpr子语句生成有效的专业化,因此格式不正确,不需要诊断。我对么?

c++ language-lawyer

4
推荐指数
1
解决办法
309
查看次数

标签 统计

c++ ×2

c++20 ×1

language-lawyer ×1