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;test1初期test1;test2;化されていないメモリにアクセスしているかのように、ランダムな文字と混合した正しい文字を出力します。

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

ただし、指定子を削除して上記のコードconstexprに置き換えるstring_viewsstrings、期待される出力が出力されます。

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

コードに明らかな間違いがないか、constexpr(まだ) 理解できない何かがあります。new のバッファを作成する方法string_viewですか? 他に何ができますか?それとも私がやろうとしていることは不可能ですか?たぶん、私のためにこれに光を当てることができる人がいます.

4

2 に答える 2