注意:我会考虑 写答案std::string_view,但boost::string_view应该是相似的。
我读到 string_view 是 const string& 的替代品
std::string_view了解最初添加的原因很有用。
有什么问题const string&?
如果你传递一个std::string对象并且你没有得到任何东西,那肯定是有效的std::string_view。但是假设现在您正在传递一个char*包含一个大字符串的值。std::string在这种情况下,将创建一个临时对象(并char*复制该对象引用的整个字符串),以便函数接收std::string. 那是std::string_view发光的时候。如果您将 achar*或 a std::string(或任何可以转换为的东西std::string_view)传递给一个接受std::string_view(按值,不需要std::string_view通过引用接受 a )的函数,那么std::string_view创建的新对象非常便宜,因为它只是“一个视图”并且它不会复制底层字符串。
但你的情况不同。由于无论如何您都在复制字符串,因此您的函数应该只按值接受字符串并将字符串移动到函数内。诸如此类的东西
Url::Url(std::string raw_url)
: url_(std::move(raw_url)) {
甚至还有一个整洁的警告告诉你这一点。
优点是,如果您的函数的用户传递了一个左值,您将制作一个副本(无论如何您都需要它)和一个移动,但是如果他们传递一个右值,那么就没有副本,只有一个移动。