【发布时间】:2017-03-06 16:12:43
【问题描述】:
我有一个接受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>&’
【问题讨论】:
-
你为什么希望它工作?
-
该函数需要一个引用字符串,而您的第二个选项不这样做。不过,在您的第一个示例中,鉴于您的示例,完全不需要
s1:std::string s2 = "test"; -
有趣的是 CLion IDE 没有抱怨,但编译器却是: -- CLIon 不是编译器。编译器获胜。
-
如果你想一想
const char*不是std::string所以它甚至需要创建一个新的临时字符串来传递给函数。但是函数修改你传入的字符串!!所以它不会接受临时的。非常量引用不会绑定到临时对象。 -
如果你需要一个非常量引用,无论如何你不能传递一个临时的。
标签: c++ string c++11 curly-braces