问题标签 [string-view]
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++ - 使用无效指针未定义行为构造 string_view 吗?
在C++ Extensions for Library Fundamentals, Version 2中,声明对于string_view
构造函数:
但没有定义什么是“有效范围”。如果 astring_view
是用指向非拥有内存的指针构造的,它是未定义的行为吗?
此外,是否要求 a在其整个生命周期内string_view
始终指向拥有的内存,还是仅适用于构造函数?
如果是这样,这个决定的理由是什么?
c++ - 为什么不支持连接 std::string 和 std::string_view?
从 C++17 开始,我们有了std::string_view
一个轻量级的视图,可以看到连续的字符序列,避免不必要的数据复制。现在const std::string&
通常建议使用std::string_view
.
但是,很快就会发现从切换const std::string&
到std::string_view
中断使用字符串连接的代码,因为不支持连接std::string
和std::string_view
:
为什么标准中不支持连接std::string
和std::string_view
?
c++ - 如何在 constexpr string_view 上使用 std::string_view::remove_prefix()
std::string_view::remove_prefix()
并且std::string_view::remove_suffix()
都是constexpr
c++17 中的成员函数;但是,它们会修改调用它们的变量。如果值是constexpr
,它也将是const
并且不能被修改,那么这些函数如何用于一个constexpr
值呢?
换一种方式:
您如何在 a 上使用这些功能constexpr std::string_view
?如果它们不能在 a 上使用constexpr std::string_view
,为什么函数本身会被标记constexpr
?
c++ - 为什么作为模板类型传递给 constexpr 函数的 string_view 会编译?
此代码无法编译。我认为这是因为 string_view 不是 LiteralType,它违反了 constexpr 函数条件(http://en.cppreference.com/w/cpp/language/constexpr):
但是...如果我用模板值替换它编译得很好。为什么编译器允许这样做?
就好像编译器忽略了 constexpr,或者 STRING_VIEWs 特征以某种方式合法地允许它通过。
将 GCC 7.1 与 -O3 -std=c++1z 一起使用。https://godbolt.org/g/z89Myb上的沙盒代码
非常感谢,亚历克斯
c++ - 如何将 std::string_view 转换为双精度?
我正在为应用程序的自定义选项文件编写 C++ 解析器。option=value
我有一个循环,它以文本文件的形式读取行,value
必须将其转换为double
. 在伪代码中,它执行以下操作:
为了处理字符串拆分和传递给函数,我使用std::string_view
它是因为它避免了过度复制并清楚地说明了查看预先存在的std::string
. 我已经做了所有事情,指向包含我要提取的值std::string_view value_str
的确切部分useful_statement
,但我无法弄清楚double
从std::string_view
.
我知道std::stod
哪个不适用于std::string_view
. 它允许我写
但是,这很难看,因为它会转换为实际上不需要的字符串,即使在我的情况下它可能不会产生明显的差异,但如果必须从文本中读取大量数字,它可能会太慢文件。
另一方面,atof
因为我不能保证一个空终止符,所以它不起作用。我可以在构造它时添加\0
to来破解它useful_statement
,但这会使代码对读者感到困惑,并且如果代码被更改/重构,它也很容易被破坏。
那么,什么是干净、直观和合理有效的方法呢?
c++ - 如何制作 constexpr 交换功能?
我正在制作自己的 String View 类以用于学习目的,并且正在尝试使其成为 100% constexpr。
为了测试它,我有一个返回哈希值的成员函数。然后,我在 switch 语句中构造我的字符串视图并调用相同的成员函数,如果它通过,则该成员函数已完成其目的。
为了学习,我正在使用/阅读/比较我的实现与 Visual Studio 2017 最新更新std::string_view
,但是,我注意到,尽管swap
被标记为constexpr
,但它不起作用,在 Visual Studio 中也不在 g++ 中。
这是一段不起作用的代码:
这是 if 的 Visual Studio 实现:
这个来自我的班级,它与 Visual Studio 中的类似。
所有构造函数和赋值都标记为 constexpr。
Visual Studio 和 g++ 都给我类似的错误。
如果交换不适用于 constexpr,为什么还要使用 constexpr?
c++ - 带有释放器的 string_view
我正在尝试std::string_view
尽可能多地使用 C 字符串,但是,每当我要包装的 C 字符串被动态分配时,我都依赖这种模式:
这是浪费时间,因为它涉及 1 次分配、1 次复制和 1 次释放。
有没有办法更好地做到这一点?还是我需要编写自己的string_view
包装器?
c++ - 将参数包解包到字符串视图中
可以将 char 类型的值模板参数包解压缩为(编译时)字符串。一个人如何获得string_view
该字符串?
我想做的事:
尝试:
错误:
有没有办法获得main
函数中的行为?
c++17 - 为什么没有从 std::string_view 到 std::string 的隐式转换?
有一个从std::string
to的隐式转换std::string_view
,它不被认为是不安全的,即使如果程序员不小心,这肯定会导致很多悬空引用。
另一方面,没有从使用相同参数的隐式转换,std::string_view
而是std::string
以完全相反的方式:因为程序员可能不小心。
很高兴 C++ 可以替代原始const char*
指针,同时让它变得超级混乱并被剥离到骨头上:
- 隐式
const char*
->std::string
:好的 - 隐式
std::string_view
->std::string
:不 - 分配
std::string
=const char*
:好的 - 分配
std::string
=std::string_view
:好的 - 附加
std::string
+=const char*
:好的 - 附加
std::string
+=std::string_view
:好的 - 串联
const char*
+std::string
:好的 - 串联
std::string_view
+std::string
:NOPE - 串联
std::string
+const char*
:好的 - 串联
std::string
+std::string_view
:NOPE
我错过了什么或者这完全是胡说八道吗?
最后,如果没有所有使其类似于的关键部分,这个字符串视图有多大用处const char*
?将它集成到stdlib的生态系统中而不是完成最后一步有什么意义?毕竟,如果我们需要一个代表一段字符串的对象,我们可以自己编写。实际上,很多图书馆早在几年前就已经这样做了。制定标准的全部意义在于使其适用于最广泛的用例,不是吗?
他们会在C++23中解决这个问题吗?
c++ - 在 constexpr 中连接 string_views
我正在尝试连接string_views
一个constexpr
. 以下是我的代码的简化版本:
但是,此代码不会产生我预期的结果。而不是打印test1;test2;test1
,test1;test2;
而是打印出与随机字符混合的正确字符,就好像我正在访问未初始化的内存一样。
但是,如果我删除说明constexpr
符并用上面的代码替换,string_views
则会strings
打印出预期的输出。
要么我在我的代码中遗漏了一些明显的错误,要么有一些constexpr
我不理解的东西(还)。这是我为新创建缓冲区的方式string_view
吗?我还能做什么?或者我想做的事情是不可能的?也许有人可以为我阐明这一点。