在 constexpr funnction 中调用basic_string函数
call basic_string function in constexpr funnction
我搜索没有找到太多关于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()
永远不能在常量表达式中调用,因为string
的size
函数没有声明constexpr
。
如果声明为constexpr
的函数永远不能用作常量表达式,则程序具有未定义的行为,编译器可能会也可能不会警告或打印有关它的错误。
如果以可用作至少一组调用参数的常量表达式的方式更改函数,则定义将不再有错误:
constexpr bool a (bool b, const string &z , const string &zz)
{
return b ? false : (z.size() > zz.size());
}
不过,您仍然不能将其称为常量表达式的一部分,b
为false
。
如注释中所述,您可以使用自 C++17 以来使用string_view
而不是const string&
来使此函数工作(假设它是使用常量表达式中可用的参数调用的(。(需要#include<string_view>
(。这是因为std::string_view
是一个文本类型(特别是它有constexpr
构造函数(,它的size
函数也是constexpr
的。
我认为此线程中的顶级答案也非常有助于回答您的问题。
相关文章:
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- std::string 构造函数如何处理固定大小的 char[]?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 构造函数采用std::string_view与std::string并移动
- 为什么我的函数接受"std::string"进行排序不会改变它?
- std::string 可以作为 nlohmann::json 传递给显式构造函数
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 无效打印(矢量<string>)函数未打印
- 为什么我不必从 std::string 的函数中释放字符串c_str?
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- C++ 模板函数无法将"std:string"转换为"double"作为回报
- 在线程中使用 std::string 函数是否安全?(C++)
- C++ 对 MBCS 使用 std::string 函数,对 UTF-16 使用 std::wstring 函数
- C++:STRING函数返回十六进制值而不是字符串
- 使用插入<string>函数时从字符到常量字符的转换无效
- C++:向量<通过<string>函数设置>初始化