c++ - 在 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>
解决方案
您是对的,您使用的所有类型都是文字类型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
如此。
推荐阅读
- python - 将数组从 PHP 传递到 Python 3
- python - 求解线性方程组以使用 scipy 最大化价值
- javascript - 从其他文件执行异步代码时的 Node.js 和 node-gtk 问题
- docker - 在多个 docker 容器之间分发文件
- python - 为什么索引 Numpy 列会创建副本,而不是行或一维数组?
- javascript - 为什么模态出现然后消失?
- c - 为什么我的 C 代码中的答案前面有“-”标记?
- c# - 从href点击列表中删除项目
- javascript - 使用 d3.js 创建径向(圆形)分组条形图
- link-to - Rails 5 无法完成“belongs_to”