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) { ... }
我有一个接受 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) { ... }