不能使用 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
是引用。 解释了原因。
我下面的代码产生了以下错误:
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
是引用。