警告:返回临时引用

时间:2009-08-27 08:17:26

标签: c++ reference

我有这样的功能

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 *“”和对静态成员的引用)不能是临时的。

5 个答案:

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

要避免的另一种可能性是声明要作为静态返回的内容,并使用按引用返回