问题标签 [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++ - 将函数参数 `const char*` 转换为 `std::string_view` 是否安全?
标题几乎说明了一切。
至
安全吗?如果没有,有什么陷阱?
std::string_view
语义规定数组不一定是空终止的,这可能是内部的一个真正问题,f
因为已考虑到这一点(例如,如果将原始指针传递给一个期望在内部以空终止的函数f
)。
c++ - constexpr C++ 容器——一种 push_back 到 initializer_list 或类似的方法
此函数将输入行解析为参数,如 shell(bash,ksh,fish) 所做的。即查看由空格或制表符分隔的输入字符串部分:
结果是输入字符串的一组视图 - vector<string_view>
。输入没有改变。
查看 C++17 string_view
,我发现大多数函数都是constexpr
. 在我的函数中只vector::push_back()
在运行时执行。所以我解决了 make parse_args()
constexpr
,需要std::vector
用 constexpr 容器替换。
我寻找一种方法来追加initializer_list
或更好地说在前一个之上创建新的 initializer_list,但没有成功。
请建议一种将“push_back”到initializer_list
或std::array
类似的 constexpr 容器的方法。我不寻找任何大型第三方库。
c++ - 如何从预处理器#if 指令调用 constexpr 函数?
我想将宏定义为字符串,稍后在编译时包含基于字符串比较的代码:
编译这个
给出错误:
编辑:
#if
指令是否在函数内部似乎很重要,因为如果它在函数内部,我们可以将其替换为但是如果它在文件顶层的函数外部if constexpr (...) { ... }
是不可能的..我忘记了#if
提到在我的真实代码中就是这种情况。
c++ - 删除 std::string_view 的最后一个字符
我正在尝试删除 std 字符串视图的最后一个字符,但无论我做什么,它都保留在那里。我认为这是因为我不小心删除了“/0”而不是所需的“]”。
这是我的代码:
这输出Foo]
. 如何删除尾随]
?
谢谢。
c++ - 通过 std::string_view 在 std::string 中擦除
我需要找到然后删除字符串的一部分(子字符串)。string_view
似乎是个好主意,但我不能让它工作string::erase
:
这是我想太多了吗?给定一个std::string_view
成一个std::string
如何擦除字符串的那部分?还是我滥用string_view
?
c++ - 从临时返回按值 string_view 时,有没有办法获得编译器警告?
我一直在通过将 c++17 更改应用于一些旧代码来学习它们,并发现返回std::string_view
会产生静默错误,在我看来,对临时编译器警告的引用是合适的。有没有办法可以生成一个?
我正在使用带有编译器标志的 g++ 9.3.0 -ggdb -Wall -std=c++17
。我还尝试了 clang 和 clang-tidy/clazy,没有任何警告。
首先,我最近了解到最好只用于std::string_view
替换const std::string &
参数,而不是作为返回值。 这篇文章对我解释得很好。不幸的是,我没有看到它通常以这种方式呈现,所以我想知道其他人是否有同样的问题。
(下面代码中的第 1 节)我知道尝试返回对临时字符串的非常量引用将无法编译。无论该引用是 astd::string &
还是 a都是如此std::string_view &
。
如果我尝试返回std::string_view &
对永久字符串的非常量引用,则会发生相同的编译器错误theString
。
(下面代码中的第 2 节)我还知道,如果我尝试返回对临时字符串的 const 引用,它将编译,但编译器会提供警告,指出我已返回对临时字符串的引用。与第 1 节一样,无论该引用是 aconst std::string &
还是 a都是如此const std::string_view &
。
同样与第 1 节一样,如果我尝试返回const std::string_view &
对永久字符串的引用,则会出现对临时编译器警告的相同引用theString
。
(下面代码中的第 3 节)如果我尝试std::string_view
从永久对象或对永久对象的引用返回 a,它当然可以正常工作,但如果我尝试从临时对象返回,它会在没有警告的情况下编译,但它的使用会产生垃圾。
编译器不应该产生与代码第 2 节中相同的临时警告引用吗?当然,它本身不是参考,但theString
也不是临时的,并且该警告已应用于那里。有没有办法可以产生这样的警告?也许我缺少 g++ 或 clang-tidy 的编译器选项?
c++ - 在这种情况下,使用 string_view 会导致不必要的字符串复制吗?
我想做的是让我的班级在施工期间接受一个字符串。我读到这string_view
是一个替代品,const string&
所以我很自然地写了一个这样的构造函数。这允许我接受 c++ 和 c 字符串。
这里可能存在的问题是,当传递一个右值时,会有一个不必要的副本而不是移动。是制作另一个构造函数的解决方案string&&
吗?这里的最佳做法是什么?
c++ - 为什么 string_view::operator== 按值接受参数
我正在阅读 string_view 的源代码,发现 operator== 按值接受参数。
为什么它按值接受参数,而不是通过 const 引用?
c++ - 返回从字符串文字创建的静态 string_view 是否安全?
我有一个相对简单的用例:我想将一个特征关联到一个类,该类将返回一些用户定义的字符串,即一些用户定义的注册 ID。由于这个注册应该在编译时定义,我希望它是 constexpr 所以我写了如下内容:
一切正常,但由于 string_view 实际上并不拥有它的缓冲区,我想知道它是否可以保证是安全的,我不只是指一个悬空指针。从我读到的字符串文字保证具有与程序本身一样长的生命周期(来自函数返回的字符串文字的这个 SO Lifetime)。
因此,这种使用 string_view 是否安全合适?