将字符串文字传递给构造函数只接受 std::string_view 的函数参数
Pass string literal to the function argument which constructor only takes std::string_view
假设我有一个对象只有 std::string_view
构造函数:
struct OnlyStringViewCtor {
std::string str_;
OnlyStringViewCtor(std::string_view str) : str_(str) {}
};
还有一个以const OnlyStringViewCtor&
为参数的函数:
void f(const OnlyStringViewCtor&) {}
当我直接调用f("hello")
时出现编译错误:
error: invalid initialization of reference of type 'const OnlyStringViewCtor&' from expression of type 'const char [6]'
有什么好的方法可以让 f("hello")
正常工作而不声明另一个构造函数,例如 OnlyStringViewCtor(const char*)
?
无法调用 f("hello");
。这将需要从 char const [6]
到 std::string_view
的隐式转换,然后再隐式转换到 OnlyStringViewCtor
,但函数参数只允许进行一次隐式转换。
一个简单的修复方法是使用 string_view
文字调用 f
,如下所示:
using namespace std::literals;
f("hello"sv);
正如另一个答案所解释的,编译器不会进行多次隐式转换。
但是,您可以使用模板来弥合差距:
struct OnlyStringViewCtor {
std::string str_;
template<typename T, std::enable_if_t<std::is_constructible_v<std::string, T>, int> = 0>
OnlyStringViewCtor(T str) : str_(str) {}
};
假设我有一个对象只有 std::string_view
构造函数:
struct OnlyStringViewCtor {
std::string str_;
OnlyStringViewCtor(std::string_view str) : str_(str) {}
};
还有一个以const OnlyStringViewCtor&
为参数的函数:
void f(const OnlyStringViewCtor&) {}
当我直接调用f("hello")
时出现编译错误:
error: invalid initialization of reference of type 'const OnlyStringViewCtor&' from expression of type 'const char [6]'
有什么好的方法可以让 f("hello")
正常工作而不声明另一个构造函数,例如 OnlyStringViewCtor(const char*)
?
无法调用 f("hello");
。这将需要从 char const [6]
到 std::string_view
的隐式转换,然后再隐式转换到 OnlyStringViewCtor
,但函数参数只允许进行一次隐式转换。
一个简单的修复方法是使用 string_view
文字调用 f
,如下所示:
using namespace std::literals;
f("hello"sv);
正如另一个答案所解释的,编译器不会进行多次隐式转换。
但是,您可以使用模板来弥合差距:
struct OnlyStringViewCtor {
std::string str_;
template<typename T, std::enable_if_t<std::is_constructible_v<std::string, T>, int> = 0>
OnlyStringViewCtor(T str) : str_(str) {}
};