将返回的字符串作为引用传递给函数,而不将其分配给字符串变量

时间:2014-10-02 18:20:02

标签: c++ string

我的函数定义为:

void func(string & str_alias)
{...}

在我的主要功能中

int main()
{
    string a;
    func((a="Cat said: ")+"Meow");
}

编译器会报告

no known conversion for argument 1 from ‘std::basic_string<char>’ to ‘std::string& {aka std::basic_string<char>&}’

虽然我知道我是否将主要功能改为:

int main()
{
    string a;
    func(a=((a="Cat said: ")+"Meow"));
}

代码会通过而没有任何问题。但我仍然想知道为什么返回的字符串不能作为引用传递给函数。为什么我必须将它分配给另一个字符串变量?

感谢。

2 个答案:

答案 0 :(得分:3)

只要您不需要更改传递的引用,就可以通过将函数签名更改为

来轻松避免这种情况。
void func(const string & str_alias)
       // ^^^^^
{...}

然后直接致电

func(string("Cat said: ") + "Meow");

(见live demo

如果您需要更改参考参数,则必须修改左值。然而写作

func(a=string("Cat said: ")+"Meow");

就足够了(参见live demo)。

答案 1 :(得分:1)

如果你对std :: string进行const引用,它应该编译。

这是因为你在第一个函数调用中做的最后一件事是调用std::string operator+(const std::string&, const char*),你看到它返回std :: string,而不是引用,因为它没有存储在任何地方,它是rvalue,它可以不会被左值引用。

第二个例子编译,因为你做的最后一件事是将它分配给变量a,它调用std::string& operator=(const char*),你可以看到返回引用,所以它可以用作非const引用本身。

感谢0x499602D2进行更正。