c++11 - 使用 {} 构造函数直接从 char* 初始化 std::string

c++11 - initialize std::string from char* directly with {} constructor

我有一个接受 std::string&:

的函数
void f(std::string& s) { ... }

我有一个 const char*,它应该是该函数的输入参数。这有效:

const char* s1 = "test";
std::string s2{s};
f(s2);

这不是:

const char* s1 = "test";
f({s1});

为什么这不可能?有趣的是 CLion IDE 没有抱怨,但编译器是:

no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::basic_string<char>&’

这与从 char const* 构造 std::string 无关。

f 需要一个字符串的左值,并且通过当场创建一个临时实例,您提供了一个右值,它不能绑定到非常量左值引用。 f(string{}) 同样无效。

一个选择是将您的函数更改为按值而不是按引用获取字符串。然后它会起作用。无论如何,在 C++11 中,有时更倾向于按值传递,而不是按引用传递。

您的函数接收到一个非 const 引用,并且您正在传递一个临时对象,该对象需要一个副本或一个 const 引用参数。两种解决方案,创建另一个函数以接收对象作为右值引用并在

内调用另一个重载
void f(string&& s) {  f(s); } 

允许临时对象作为参数,或更改您的函数定义以接收任何对象但作为常量引用

void f(const std::string& s) { ... }