我的函数定义为:
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"));
}
代码会通过而没有任何问题。但我仍然想知道为什么返回的字符串不能作为引用传递给函数。为什么我必须将它分配给另一个字符串变量?
感谢。
答案 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进行更正。