如何将 std::string_view 转换为 std::string

How to make a conversion from std::string_view to std::string

下面这段代码从 std::string_viewstd::string 的转换怎么可能编译:

struct S {
    std::string str;
    S(std::string_view str_view) : str{ str_view } { }
};

但是这个不编译?

void foo(std::string) { }
int main() {
    std::string_view str_view{ "text" };
    foo(str_view);
}

第二个报错:cannot convert argument 1 from std::string_view to std::string and no sutiable user-defined conversion from std::string_view to std::string exists.

如何正确调用foo()

How should I call foo() properly?

像这样:

foo(std::string{str_view});

How is it possible that this code below with conversion from std::string_view to std::string compiles:

它是 std::string 的显式转换。它可以调用显式转换构造函数。

but this one does not compile?

这是对std::string的隐式转换。它不能调用显式转换构造函数。

您尝试调用的构造函数是

// C++11-17
template< class T >
explicit basic_string( const T& t,
                       const Allocator& alloc = Allocator() );

// C++20+                                          
template< class T >
explicit constexpr basic_string( const T& t,
                                 const Allocator& alloc = Allocator() );

如您所见,它被标记为 explicit,这意味着不允许隐式转换调用该构造函数。

str{ str_view } 中,您使用字符串视图显式初始化字符串,因此它是允许的。

使用 foo(str_view) 时,您依赖编译器将 string_view 隐式转换为 string,并且由于显式构造函数,您将遇到编译器错误。要修复它,您需要明确说明 foo(std::string{str_view});