【问题标题】:warning: returning reference to temporary警告:返回对临时的引用
【发布时间】:2010-11-23 07:12:53
【问题描述】:

我有这样的功能

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

【问题讨论】:

    标签: c++ reference


    【解决方案1】:

    问题出在第一行。 "" 将转换为 std::string,因为它有一个有效的构造函数,该构造函数采用 char*std::string 将是一个匿名对象,它是临时的,您返回它的引用。

    【讨论】:

      【解决方案2】:

      就像 Shaggy Frog 所说,它将 "" 转换为临时 std::string 对象,并且由于您的方法签名是 std::string& 它尝试返回对它的引用,因此您会收到警告。一种解决方法可能是按值返回 std::string (const std::string SomeClass::Foo(..))。

      【讨论】:

        【解决方案3】:

        这是一个发生不需要的隐式转换的示例。 "" 不是 std::string,所以编译器试图找到一种方法将其变成一个。通过使用string( const char* str ) 构造函数,它在该尝试中成功。 现在已经创建了一个std::string 的临时实例,该实例将在方法调用结束时被删除。因此,在方法调用之后引用一个不再存在的实例显然不是一个好主意。

        我建议您将返回类型更改为const string 或将"" 存储在SomeClass 的成员或静态变量中。

        【讨论】:

        • 一个很好的答案!这就是为什么我认为 C++ 不是当今编程挑战的好选择。当您更愿意专注于手头的问题时,它会花费您时间来关注其内部工作。
        • @Luis:你想提到的每种语言都有这些极端情况的陷阱。
        • 这里似乎需要的转换! :P 一旦你改为按值返回,const 也应该被删除。
        • @Luis。 C++ 现在很棒,然后(当您发布时),并且可能永远!最佳语言或架构等取决于您的用例。
        【解决方案4】:

        这是尝试在 c++ 中优化代码的示例。我做到了,每个人都做到了... 值得一提的是,这是符合返回值优化条件的经典例子。

        就像 ttvd 所说,正确的答案是返回 const std::string 而不是对它的引用,并让编译器对其进行优化。

        如果您相信您最喜欢的语言的解释器会在您身后进行优化,那么您也不应该尝试对 C++ 过于聪明。

        【讨论】:

        • “正确的答案是[...]让编译器优化它。”
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 2017-12-28
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          相关资源
          最近更新 更多