在 constexpr funnction 中调用basic_string函数

call basic_string function in constexpr funnction

本文关键字:string 函数 basic 调用 constexpr funnction      更新时间:2023-10-16

我搜索没有找到太多关于constexpr函数的信息。C++入门说返回类型和每个参数的类型必须是文本类型。现在返回类型 i 使用 bool 和参数类型 i 使用引用。但是在返回中我使用两个basic_string函数来计算结果.clion 告诉我不能在 constexpr 函数中使用basic_string函数

constexpr bool a (const string &z , const string &zz)
{
return (z.size() > zz.size());
}

非常感谢您回答我的问题!

你说的没错,你使用的所有类型都是文字类型,但constexpr函数还有另一个要求。

constexpr函数必须至少可调用一组参数,以便调用是常量表达式。

问题是z.size()永远不能在常量表达式中调用,因为stringsize函数没有声明constexpr

如果声明为constexpr的函数永远不能用作常量表达式,则程序具有未定义的行为,编译器可能会也可能不会警告或打印有关它的错误。

如果以可用作至少一组调用参数的常量表达式的方式更改函数,则定义将不再有错误:

constexpr bool a (bool b, const string &z , const string &zz)
{
return b ? false : (z.size() > zz.size());
}

不过,您仍然不能将其称为常量表达式的一部分,bfalse


如注释中所述,您可以使用自 C++17 以来使用string_view而不是const string&来使此函数工作(假设它是使用常量表达式中可用的参数调用的(。(需要#include<string_view>(。这是因为std::string_view是一个文本类型(特别是它有constexpr构造函数(,它的size函数也是constexpr的。

我认为此线程中的顶级答案也非常有助于回答您的问题。