问题标签 [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.

0 投票
2 回答
1571 浏览

c++ - 将函数参数 `const char*` 转换为 `std::string_view` 是否安全?

标题几乎说明了一切。

安全吗?如果没有,有什么陷阱?

std::string_view语义规定数组不一定是空终止的,这可能是内部的一个真正问题,f因为已考虑到这一点(例如,如果将原始指针传递给一个期望在内部以空终止的函数f)。

0 投票
1 回答
225 浏览

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_liststd::array类似的 constexpr 容器的方法。我不寻找任何大型第三方库。

0 投票
1 回答
250 浏览

c++ - 如何从预处理器#if 指令调用 constexpr 函数?

我想将宏定义为字符串,稍后在编译时包含基于字符串比较的代码:

编译这个

给出错误:

编辑

#if指令是否在函数内部似乎很重要,因为如果它在函数内部,我们可以将其替换为但是如果它在文件顶层的函数外部if constexpr (...) { ... }是不可能的..我忘记了#if提到在我的真实代码中就是这种情况。

0 投票
1 回答
413 浏览

c++ - 删除 std::string_view 的最后一个字符

我正在尝试删除 std 字符串视图的最后一个字符,但无论我做什么,它都保留在那里。我认为这是因为我不小心删除了“/0”而不是所需的“]”。

这是我的代码:

这输出Foo]. 如何删除尾随]

谢谢。

0 投票
2 回答
308 浏览

c++ - 通过 std::string_view 在 std::string 中擦除

我需要找到然后删除字符串的一部分(子字符串)。string_view似乎是个好主意,但我不能让它工作string::erase

这是我想太多了吗?给定一个std::string_view成一个std::string如何擦除字符串的那部分?还是我滥用string_view

0 投票
1 回答
217 浏览

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 的编译器选项?

0 投票
1 回答
274 浏览

c++ - std::string_view 的 noexcept 构造函数

根据文档, std::string_view 有一个构造函数,它采用 aconst char *和 a std::size_t,但未声明noexcept

另一方面,文档还声明了用户定义的 literal operator""sv,在我见过的所有实现中,它都是该构造函数的简单包装器,被声明为noexcept

你知道这种差异的原因吗?构造函数什么时候可以抛出?

0 投票
1 回答
464 浏览

c++ - 在这种情况下,使用 string_view 会导致不必要的字符串复制吗?

我想做的是让我的班级在施工期间接受一个字符串。我读到这string_view是一个替代品,const string&所以我很自然地写了一个这样的构造函数。这允许我接受 c++ 和 c 字符串。

这里可能存在的问题是,当传递一个右值时,会有一个不必要的副本而不是移动。是制作另一个构造函数的解决方案string&&吗?这里的最佳做法是什么?

0 投票
2 回答
58 浏览

c++ - 为什么 string_view::operator== 按值接受参数

我正在阅读 string_view 的源代码,发现 operator== 按值接受参数。

为什么它按值接受参数,而不是通过 const 引用?

0 投票
1 回答
464 浏览

c++ - 返回从字符串文字创建的静态 string_view 是否安全?

我有一个相对简单的用例:我想将一个特征关联到一个类,该类将返回一些用户定义的字符串,即一些用户定义的注册 ID。由于这个注册应该在编译时定义,我希望它是 constexpr 所以我写了如下内容:

https://godbolt.org/z/5p8xkA

一切正常,但由于 string_view 实际上并不拥有它的缓冲区,我想知道它是否可以保证是安全的,我不只是指一个悬空指针。从我读到的字符串文字保证具有与程序本身一样长的生命周期(来自函数返回的字符串文字的这个 SO Lifetime)。

因此,这种使用 string_view 是否安全合适?