将字符串文字传递给构造函数只接受 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) {}
};

https://godbolt.org/z/1reajv