如何将 std::string_view 转换为 std::string
How to make a conversion from std::string_view to std::string
下面这段代码从 std::string_view
到 std::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});
下面这段代码从 std::string_view
到 std::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});