如何在 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 替换全局 const char[] 的陷阱?