首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >串接式string_views

串接式string_views
EN

Stack Overflow用户
提问于 2017-11-29 16:01:18
回答 2查看 10K关注 0票数 3

我正在尝试将string_views连接到constexpr中。以下是我的代码的简化版本:

代码语言:javascript
复制
#include <iostream>
#include <string_view>

using namespace std::string_view_literals;

// concatenate two string_views by copying their bytes
// into a newly created buffer
constexpr const std::string_view operator+
    (const std::string_view& sv1, const std::string_view& sv2)
{
    char buffer[sv1.size()+sv2.size()] = {0};
    for(size_t i = 0; i < sv1.size(); i++)
        buffer[i] = sv1[i];
    for(size_t i = sv1.size(); i < sv1.size()+sv2.size(); i++)
        buffer[i] = sv2[i-sv1.size()];
    return std::string_view(buffer, sv1.size()+sv2.size());
}

int main()
{
    const std::string_view sv1("test1;");
    const std::string_view sv2("test2;");
    std::cout << sv1 << "|" << sv2 << ": " << (sv1+sv2+sv1) << std::endl;
    std::cout << "test1;"sv << "|" << "test2;"sv << ": " <<
        ("test1;"sv+"test2;"sv) << std::endl;
    return 0;
}

然而,这段代码并没有产生我预期的结果。它没有打印test1;test2;test1test1;test2;,而是打印出与随机字符混合的正确字符,就好像我正在访问未初始化的内存一样。

代码语言:javascript
复制
test1;|test2;: F��<��itest;
test1;|test2;: est1;te`�i

但是,如果我移除constexpr说明符,并将string_views替换为strings,那么上面的代码将输出预期的输出。

代码语言:javascript
复制
test1;|test2;: test1;test2;test1;
test1;|test2;: test1;test2;

我可能在代码中遗漏了一些明显的错误,或者constexpr有一些我还不明白的地方。这是我为新string_view创建缓冲区的方式吗?我还能做什么?还是我想做的不可能?也许有人能帮我解释清楚。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-29 16:03:47

从根本上说,您的任务是不可能完成的,因为根据定义,string_view需要从开始到结束都有连续的不拥有存储。因此,不可能管理数据的生存期。

如果您想要这样做,需要创建某种类型的concatenated_string<>自定义范围作为您的返回类型。

至于代码产生奇怪结果的具体原因,这仅仅是因为当函数退出时,buffer不再存在。

票数 3
EN

Stack Overflow用户

发布于 2017-11-29 16:05:49

return std::string_view(buffer, sv1.size()+sv2.size());中,返回的string_view查看超出作用域的buffer,因此实际上有一个悬空引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47556948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档