如何在 constexpr string_view 上使用 std::string_view::remove_prefix()

Posted

技术标签:

【中文标题】如何在 constexpr string_view 上使用 std::string_view::remove_prefix()【英文标题】:How to use std::string_view::remove_prefix() on a constexpr string_view 【发布时间】:2017-06-26 16:48:17 【问题描述】:

std::string_view::remove_prefix()std::string_view::remove_suffix()都是c++17中的constexpr成员函数;但是,它们会修改调用它们的变量。如果该值为constexpr,那么它也将是const,并且无法修改,那么这些函数如何在constexpr值上使用呢?

换一种说法:

constexpr std::string_view a = "asdf";
a.remove_prefix(2); // compile error- a is const

您如何在constexpr std::string_view 上使用这些功能?如果它们不能在constexpr std::string_view 上使用,为什么函数本身标记为constexpr

【问题讨论】:

【参考方案1】:

它们被标记为constexpr 的原因是您可以在constexpr 函数中使用它们,例如:

constexpr std::string_view remove_prefix(std::string_view s) 
    s.remove_prefix(2);
    return s;


constexpr std::string_view b = remove_prefix("asdf"sv);

如果remove_prefix() 不是constexpr,这将是一个错误。


也就是说,我会写:

constexpr std::string_view a = "asdf"sv.substr(2);

【讨论】:

这是有道理的,但函数实际上是constexpr void remove_prefix(size_type)。你能在 constexpr 中使用唯一目的是改变现有对象的方法吗? @Useless 我的答案中的代码正是这样做的。我同意这很奇怪。 确实如此!我完全误读了您的免费功能。它在 GCC7.1 中实际上对我不起作用,但我想现在是 1z 的早期阶段。 @Useless 是的,我也注意到了——libstdc++ 的remove_prefix() 实现没有标记为constexpr @inetknght 不,它没有。 constexpr 成员函数不必是 const 成员函数。

以上是关于如何在 constexpr string_view 上使用 std::string_view::remove_prefix()的主要内容,如果未能解决你的问题,请参考以下文章

constexpr string_view 比较

任何用 constexpr string_view 替换全局 const char[] 的陷阱?

如何从预处理器#if 指令调用 constexpr 函数?

std::string_view 编译时散列

为啥这个 std::string_view 不是常量表达式?

如何将 boost::string_view 转换为 std::string_view?