#include // using std::free #include #include // using std::exchange class CSView { std::string_view view; public: explicit CSView(char* ptr) noexcept : view(ptr) {} CSView(CSView&& o) noexcept : view(std::exchange(o.view, std::string_view{})) {} ~CSView() { std::free(const_cast(view.data())); } void swap(CSView& o) noexcept { view.swap(o.view); } friend void swap(CSView& left, CSView& right) noexcept { left.swap(right); } CSView& operator=(CSView&& o) noexcept { CSView tmp = std::move(o); swap(tmp); return *this; } const std::string_view& operator*() const noexcept { return view; } const std::string_view* operator->() const noexcept { return &view; } }; #include // using std::strcpy #include // using std::cout int main() { char* ptr = static_cast(std::malloc(80)); std::strcpy(ptr, "Hello World\n"); CSView cs { ptr }; std::cout << "World at " << cs->find("World") << " in " << *cs; }