3

我正在尝试连接string_views一个constexpr. 以下是我的代码的简化版本:

#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;而是打印出与随机字符混合的正确字符,就好像我正在访问未初始化的内存一样。

test1;|test2;: F��<��itest;
test1;|test2;: est1;te`�i

但是,如果我删除说明constexpr符并用上面的代码替换,string_views则会strings打印出预期的输出。

test1;|test2;: test1;test2;test1;
test1;|test2;: test1;test2;

要么我在我的代码中遗漏了一些明显的错误,要么有一些constexpr我不理解的东西(还)。这是我为新创建缓冲区的方式string_view吗?我还能做什么?或者我想做的事情是不可能的?也许有人可以为我阐明这一点。

4

2 回答 2

2

您的任务从根本上是不可能的,因为string_view根据定义,需要从头到尾拥有连续的非拥有存储。因此,管理数据的生命周期是不可能的。

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

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

于 2017-11-29T16:03:47.107 回答
2

return std::string_view(buffer, sv1.size()+sv2.size());返回的string_view视图中buffer超出范围,所以你基本上有一个悬空引用。

于 2017-11-29T16:05:49.573 回答