警告:返回临时引用

jac*_*hab 24 c++ reference

我有这样的功能

const string &SomeClass::Foo(int Value)
{
    if (Value < 0 or Value > 10)
        return "";
    else
        return SomeClass::StaticMember[i];
}
Run Code Online (Sandbox Code Playgroud)

我得到warning: returning reference to temporary.这是为什么?我认为函数返回的两个值(引用const char*""和对静态成员的引用)不能是临时的.

Chr*_*ian 48

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

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

  • @Luis:你提到的每种语言都有这些角落案例. (17认同)
  • 一个很好的答案!这就是为什么我认为C++不是现在编程挑战的好选择.当你更愿意把注意力集中在手上的问题时,它会耗费你的时间来关注它的内在作品. (15认同)

Emm*_*dec 6

这是尝试在c ++中优化代码的示例.我做到了,每个人都做到了......值得一提的是,这是有资格返回价值优化的经典例子.

像ttvd一样,正确的答案是返回const std :: string而不是对它的引用,并让编译器优化它.

如果您相信您喜欢的语言的翻译能够在您身后进行优化,那么您也不应该尝试使用C++过于聪明.


Sha*_*rog 5

问题出在第一行.""将变成一个std::string,因为它有一个有效的构造函数,需要一个char*.这std::string将是一个匿名对象,这是临时的,你返回它的引用.