首页 > 解决方案 > gsl::cstring_span 不支持 constexpr 吗?如果不是,我为什么要使用它?

问题描述

我有一段看起来像这样的代码:

constexpr gsl::cstring_span<> const somestring{"Hello, I am a string"};

并且它拒绝编译一条消息,抱怨某处正在调用某些非 constexpr 函数。

为什么是这样?这似乎是要支持的最重要的用例。重点是尽可能检查编译时边界。涉及常量字符串文字的编译时间界限检查似乎是最常使用的东西。但是,如果不能声明,就不会发生这种情况constexpr。这里发生了什么?

标签: c++cpp-core-guidelinesms-gsl

解决方案


我认为问题在于字符串文字的类型为数组const char并且以空值结尾。但是谁说你是cstring_span从一个以空结尾的数组构造你的呢?

因此,构造函数cstring_span会进行物理检查以删除空终止符(如果存在),否则接受数组的全长。

我不确定constexpr表达式有多强大,但可能以某种constexpr方式实现它。您可以在这里创建一个问题来询问它:

https://github.com/Microsoft/GSL/issues


推荐阅读