我在搜索中没有找到多少关于警察函数的信息。C++引物表示返回类型和每个参数的类型必须是文字类型。现在返回类型,我使用bool和参数类型,我在返回中使用reference.but,我使用两个basic_string函数来计算,results.clion是告诉我不能使用basic_string函数
constexpr bool a (const string &z , const string &zz)
{
return (z.size() > zz.size());
}非常感谢你回答我的问题!
发布于 2020-01-24 09:17:00
您所使用的所有类型都是文字类型,这是正确的,但是constexpr函数还有另一个要求。
必须对至少一组参数调用constexpr函数,以便调用是一个常量表达式。
问题是,z.size()永远不能在常量表达式中调用,因为string的size函数没有被声明为constexpr。
如果声明为constexpr的函数永远不能用作常量表达式,则程序具有未定义的行为,编译器可能警告或不打印有关它的错误。
如果您以一种可用作至少一组调用参数的常量表达式的方式更改该函数,则该定义将不再出现错误:
constexpr bool a (bool b, const string &z , const string &zz)
{
return b ? false : (z.size() > zz.size());
}但是,您仍然不能将它作为常量表达式的一部分来调用,而使用b作为false。
正如注释中提到的那样,您可以通过使用string_view而不是自C++17 (需要#include<string_view>)来使用C++17来实现这个函数的工作(假设它是用在常量表达式中可用的参数调用的)。这是因为std::string_view是一个文字类型(特别是它有constexpr构造函数),而且它的size函数也是constexpr。
发布于 2020-01-24 10:52:38
我认为this线程中的顶部答案对于回答您的问题也很有帮助。
https://stackoverflow.com/questions/59893202
复制相似问题