首页 > 解决方案 > 在 constexpr 函数中调用 basic_string 函数

问题描述

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

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

非常感谢您回答我的问题!</p>

标签: c++c++11

解决方案


您是对的,您使用的所有类型都是文字类型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如评论中所述,您可以通过使用而不是const string&自 C++17 起使此函数工作(假设使用可在常量表达式中使用的参数调用它) 。(需要#include<string_view>)。这是有效的,因为std::string_view它是一种文字类型(特别是它具有constexpr构造函数)并且它的size功能也是 constexpr如此。


推荐阅读