I'm trying to concatenate string_views
in a constexpr
.
The following is a simplified version of my code:
#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;
}
However this code does not produce the result I expected. Instead of printing test1;test2;test1
and test1;test2;
it prints out correct characters mixed with random characters as if I'm accessing uninitialized memory.
test1;|test2;: F��<��itest;
test1;|test2;: est1;te`�i
However if I remove the constexpr
specifier and replace the string_views
with strings
the above code prints the expected output.
test1;|test2;: test1;test2;test1;
test1;|test2;: test1;test2;
Either I'm missing some obvious mistake in my code or there is something about constexpr
that I don't understand (yet). Is it the way I'm creating the buffer for the new string_view
? What else could I do? Or is what I'm trying to do impossible? Maybe there is someone who can shed light to this for me.