以下代码:
void test(string &s){ // if the argument is "string s", it works
return test(s+',');
}
编译器报告找不到函数:test(std :: basic_string)。
我认为编译器会创建一个临时字符串(== s +','),我可以传递它的引用。 但似乎我错了。我不知道为什么我不能传递这个临时字符串的引用。
答案 0 :(得分:1)
使它成为const:
void test(const std::string &s){ // if the argument is "string s", it works
return test(s+',');
}
答案 1 :(得分:1)
您无法将临时绑定绑定到非常量引用。您可以通过const
引用(或者,正如您指出的那样,通过值)
void test(string const & s){ // or string s
return test(s+',');
}
或使用命名变量而不是临时
void test(string & s){
std::string s2 = s + ',';
return test(s2);
}
如前所述,在评论中,这段代码具有未定义的运行时行为,不应在“真实”代码中使用;它的目的只是如何修复观察到的编译错误的最小例子
答案 2 :(得分:0)
标准C ++不允许将非const 左值引用绑定到 rvalue 。在您的示例中,表达式s+','
的结果是临时的,因此是 rvalue ,因此编译器需要丢弃期望左值的test
的重载引用,没有可用于调用的过载。这就是为什么它抱怨无法找到函数test
。
要解决此问题,您必须提供一个重载,其参数可以绑定到 rvalue 。当你意识到自己时,期望一个参数 by-copy 可以工作,但是它可能会通过调用copy / move-ctors来暗示不必要的开销。更好的选择是通过引用来预期参数。由于const lvalue 引用可以绑定到 rvalues ,因此声明函数如下可以解决问题。
void test(std::string const& s)
答案 3 :(得分:0)
但首先你应该看到这个问题String Concatenation
concatenating strings using "+" in c++
替代解决方案
void test(string &s)
{
s.append(",");
return test(s);
}