不能使用 if constexpr

Can't use if constexpr

我下面的代码产生了以下错误:

C2131: expression did not evaluate to a constant.

    template<int32_t M, int32_t N>
    [[nodiscard]] constexpr double determinant(const Matrix<M,N> & m)
    {
        double det = 0;
        if constexpr(m.rows() == 2)
        {
            return m[0][0]*m[1][1] - m[0][1]*m[1][0];
        }
        else
        {
            for(std::size_t col = 0; col < m.cols(); ++col)
            {
                det += m[0][col] * cofactor(m, 0, col);
            }
        }
        return det;
    }

我的常规 if 语句的“第一个”错误是:

C1202: recursive type or function dependency context too complex.

Whosebug 上有人在做类似的事情时遇到了类似的错误,他的解决方案是使用 if constexpr,否则无法在编译时评估 if 语句。但这会产生我当前的错误 C2131。

Matrix<M,N> 有一个方法 rows() 也是 constexpr。有人可以向我解释为什么这段代码无法编译吗?

如果Matrix<M, N>rows()定义为returnM,只需替换

if constexpr (m.rows() == 2)

if constexpr (M == 2)

m.rows() 不会生成常量表达式,即使 rows() 被标记为 constexpr,因为 m 是引用。 解释了原因。