【发布时间】:2021-06-23 04:51:57
【问题描述】:
我想像这样在编译时比较字符串视图:
constexpr bool isMatch(const string_view str) {
if constexpr (str == "firstMatch"sv) {
return true;
} else if constexpr (str == "secondMatch"sv) {
return true;
}
// ....
}
函数是这样调用的:
isMatch("something"sv);
这显然是不变的,因为它就在代码中。
但是编译器说 if constexpr 中的表达式'没有计算为常量'。但是 string_view 的 operator== 是 constexpr。一个解决方案是声明参数 constexpr 但这是不可能的。
那么我怎样才能有一个 constexpr 函数在编译时检查这些匹配?
【问题讨论】:
-
从
if constexpr中删除constexpr。 -
您的
str参数不是 constexpr,因此表达式str == "abc"不是 constexpr。请注意,constexpr函数可以在运行时调用,这意味着str可能是运行时已知值,因此您不能始终保证该值在编译时已知。 -
@KamilCuk 如果我删除 constexpr,我无法保证代码将在编译时执行,并且我无法在最后创建
static_assert(false "invalid str")以确保 str 有效。 -
如果函数是在编译时调用的,那么无论
if是不是constexpr,很明显body也是在编译时执行的。如果您必须处理不同的类型和模板参数,if constexpr最有用。 -
如果你想确保你的代码在编译时运行,并且你有 C++20,你可以改用函数
consteval。
标签: c++ constexpr string-view