问题标签 [string-span]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 提升::any_range> 在发布模式下崩溃
我观察到以下代码的一个相当奇怪的行为:
这里的想法是隔离一个字符串序列的实际表示,该字符串序列作为参数由andf
后面的函数接收(注意,提交更改为几个小时前已在 GSL 中进行)。any_range
gsl::string_span
string_view
string_span
我的原始代码没有const T
asReference
模板参数any_range
(它很简单T
),并且在执行期间崩溃了。但是,这仅在发布模式下发生,在 Debug 或 RelWithDebInfo(由 CMake 生成)中运行良好。我使用了 VS2013/2015 x64。此外,尝试调试完整的 Release 版本,将调试输出添加到转换 lambda 消除了崩溃(我的猜测是它阻止了一些内联)。我最终的工作解决方案是指定const T
为Reference
.
但是,我仍然想知道为什么崩溃首先发生?它是VS编译器错误吗?当前实现中的错误string_span
?还是我只是在滥用boost::any_range
?
编辑
刚刚使用 clang 3.7.0 构建了版本并且行为相似(在调试中工作正常并且不会崩溃,但在没有const T
with 的情况下输出垃圾-O2
)。所以它似乎不是编译器问题。
c++ - 为什么 string_view 构造函数不采用一对迭代器
boost 中的 string_ref 和 GSL 中的 string_span 都没有定义采用一对迭代器的构造函数。这个决定的原因是什么?
通常这没什么大不了的,我可以像这样创建 string_ref :
但我想要采用一对迭代器的构造函数的原因是因为我的代码如下所示:
目前,我可以这样称呼它:
我想将其更改为:
但是该代码无法编译,因为缺少构造函数在 string_ref 中采用一对迭代器
string-view - gsl::string_span 和 std::string_view 有何不同?
据我所知,gsl::string_span
似乎std::string_view
有基本相同的使用理由。真的是这样吗?如果是这样,它们实际上是否相同?如果不是 - 它们有何不同?
c++ - 将 gsl::zstring_view 与 C API 一起使用
我正在尝试使用现代字符串处理方法(如std::string_view
或GSL'sstring_span
)与将字符串作为空终止的 C API(DBus)进行交互const char*
,例如
string_view
并且string_span
不保证它们的内容是空终止的——因为跨度是(char* start, ptrdiff_t length)
对的,这在很大程度上是重点。但是 GSL 也提供了一个zstring_view
,它保证是空终止的。周围的评论zstring_span
表明它是专为处理遗留 API 和 C API 而设计的,但我一开始使用它就遇到了几个症结:
将字符串文字表示为 a
string_span
很简单:但是将一个表示为 a
zstring_span
需要您将文字包装在辅助函数中:这使得声明更加嘈杂,而且文字(保证以 null 结尾)不能隐式转换为 a 似乎也很奇怪
zstring_span
。ensure_z()
也不是constexpr
,不像string_span
.有一个类似的奇怪之处
/li>std::string
,它可以隐式转换为string_span
,但不是zstring_span
,尽管std::string::data()
自 C++11 以来已保证返回一个以空值结尾的序列。同样,您必须致电ensure_z()
:似乎存在一些 const 正确性问题。上述工作,但
编译失败,出现关于无法转换为的
span<char, ...>
错误span<const char, ...>
这一点比其他点小,但返回 a 的成员函数
char*
(您可以将其提供给像 DBus 这样的 C API)被调用assume_z()
。当构造函数期望一个以空值结尾的范围时,会假设什么?zstring_span
如果zstring_span
设计为“将零终止跨度转换为遗留字符串”,为什么在这里使用它看起来如此麻烦?我在滥用它吗?有什么我忽略的吗?