当我传递对此函数的引用时,为什么它不起作用?

时间:2014-01-03 16:30:15

标签: c++ reference

以下代码:

void test(string &s){ // if the argument is "string s", it works
    return test(s+',');
}

编译器报告找不到函数:test(std :: basic_string)。

我认为编译器会创建一个临时字符串(== s +','),我可以传递它的引用。 但似乎我错了。我不知道为什么我不能传递这个临时字符串的引用。

4 个答案:

答案 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);
}