我有这样的功能
const string &SomeClass::Foo(int Value)
{
if (Value < 0 or Value > 10)
return "";
else
return SomeClass::StaticMember[i];
}
我得到warning: returning reference to temporary
。这是为什么?我认为函数返回的两个值(引用const char *“”和对静态成员的引用)不能是临时的。
答案 0 :(得分:48)
这是发生不需要的隐式转换的示例。 ""
不是std::string
,因此编译器会尝试找到将其转换为一种方法的方法。通过使用string( const char* str )
构造函数,它成功完成了该尝试。
现在已创建std::string
的临时实例,该实例将在方法调用结束时删除。因此,在方法调用之后引用一个不再存在的实例显然不是一个好主意。
我建议您将返回类型更改为const string
或将""
存储在SomeClass
的成员或静态变量中。
答案 1 :(得分:6)
这是尝试在c ++中优化代码的示例。我做到了,每个人都做到了...... 值得一提的是,这是有资格返回值优化的经典示例。
就像ttvd所说,正确的答案是返回const std :: string而不是对它的引用,让编译器优化它。
如果你相信你最喜欢的语言的翻译能够在你身后进行优化,那么你也不应该试着用C ++过于聪明。
答案 2 :(得分:5)
问题出在第一行。 ""
将变为std::string
,因为它有一个有效char*
的构造函数。 std::string
将是一个匿名对象,这是临时的,您将返回其引用。
答案 3 :(得分:4)
像Shaggy Frog所说,它将“”转换为临时的std :: string对象,因为你的方法签名是std :: string&amp;它试图返回对它的引用,因此你得到警告。一种解决方法可能是按值返回std :: string(const std :: string SomeClass :: Foo(..))。
答案 4 :(得分:0)
要避免的另一种可能性是声明要作为静态返回的内容,并使用按引用返回