C++ C++;在constexpr if中使用string_视图

C++ C++;在constexpr if中使用string_视图,c++,constexpr,string-view,C++,Constexpr,String View,我想在编译时比较字符串视图,如下所示: constexpr bool isMatch(const string\u view str){ 如果constexpr(str==“firstMatch”sv){ 返回true; }如果constexpr(str==“secondMatch”sv),则为else{ 返回true; } // .... } 函数的调用方式如下: isMatch(“某物”sv); 这显然是常数,因为它在代码中是正确的 但是编译器说if constexpr中的表达式“没有计

我想在编译时比较字符串视图,如下所示:

constexpr bool isMatch(const string\u view str){
如果constexpr(str==“firstMatch”sv){
返回true;
}如果constexpr(str==“secondMatch”sv),则为else{
返回true;
}
// ....
}
函数的调用方式如下:

isMatch(“某物”sv);
这显然是常数,因为它在代码中是正确的

但是编译器说if constexpr中的表达式“没有计算为常量”。但是string_视图的运算符==是constexpr。解决方案是声明参数constexpr,但这是不可能的

那么,我怎样才能有一个constexpr函数在编译时检查这些匹配呢

如何使用constexpr函数检查此类匹配

只需从
if
s中删除
constepr

constexpr bool isMatch(const string_view str) {
  if (str == "firstMatch"sv) {
      return true;
  } else if (str == "secondMatch"sv) {
     return true;
  }
  return false;
}
std::string\u view::operator=
constepr
,所以一切正常

在编译时

在编译时上下文中调用函数。比如:

#include <array>
#include <cassert>
#include <string_view>
using namespace std::literals;

constexpr bool isMatch(const std::string_view str) {
  if (str == "firstMatch"sv) {
      return true;
  } else if (str == "secondMatch"sv) {
     return true;
  }
  return false;
}

int main() {
    std::array<int, isMatch("secondMatch"sv)> arr;
    static_assert(isMatch("firstMatch"sv));
    constexpr bool var = isMatch("No match for you!"sv);
}
#包括
#包括
#包括
使用名称空间std::literals;
constexpr bool isMatch(const std::string\u view str){
如果(str==“firstMatch”sv){
返回true;
}else if(str==“secondMatch”sv){
返回true;
}
返回false;
}
int main(){
std::阵列arr;
静态_断言(isMatch(“firstMatch”sv));
constexpr bool var=isMatch(“不适合你!”sv);
}

在C++20中,如果constexpr,您可以确保只在编译时使用
consteval

中删除
constexpr
。您的
str
参数不是constexpr,因此表达式
str==“abc”
不是constexpr。请注意,
constepr
函数可以在运行时调用,这意味着
str
可能是运行时已知的值,因此您不能总是保证该值在编译时已知。@KamilCuk如果我删除constepr,我不能保证代码将在编译时执行,并且我不能进行
静态断言(假“无效str”)
以确保str有效。如果在编译时调用函数,则无论
If
是否为
constexpr
,正文显然也会在编译时执行。
If constexpr
在必须处理不同类型和模板参数时最有用。如果要确保如果你的代码在编译时运行,并且你有C++20,你可以改为使用函数
consteval
。好的,看起来不错,但是如果我有一个函数
foo(bool match)
并像调用
foo(isMatch(“test”sv))那样调用它,我可以在编译时执行吗
?在这种情况下,
isMatch
是编译时吗?因为我可以定义一个
constexpr bool match=isMatch(“test”sv)
,然后调用
foo(match)
,但这太麻烦了,我想直接传递它。你必须将“保证编译时”与“是编译时”分开.理论上,当您编写
foo(1==1)时
不能保证
1==1
比较将在编译时执行。但实际上,任何编译器都会对其进行优化。它与
constepr
函数类似。可以在运行时执行
constepr
函数。但任何自尊的编译器都会对其进行优化。因此,回答
foo(isMatch)(“test”sv))?isMatch是否是编译时的
对此没有任何保证,但它将是。如果您需要这种保证,请明确地向编译器传达这一意图。