警告C4172:返回对绑定到局部变量的const std :: string的引用。它有多安全?

时间:2011-08-12 11:18:01

标签: c++ compiler-warnings object-lifetime const-reference

我刚刚在工作中构建了一个项目,我看到添加了一个新功能:

const std::string& ClassName::MethodName() const
{
   return "";
}

编译器发出警告:

  

警告C4172:返回本地变量的地址或临时

我认为编译器是正确的。 此功能的安全性如何?

请注意,该函数不会返回const char*,因为字符串文字具有静态存储持续时间,所以这是正常的。它返回对const std::string

的引用

4 个答案:

答案 0 :(得分:7)

是的,这不安全 返回局部变量或临时变量的地址并取消引用它会导致未定义的行为。

正如你评论的那样:
是的,临时绑定到常量引用的生命周期增加到常量的生命周期。但是这需要调用者接受const引用中的返回值,所以函数本身并不安全。

来自C ++标准:
C ++ 03 12.2临时对象

第二个上下文是引用绑定到临时的。引用绑定的临时对象或作为临时绑定的子对象的完整对象的临时对象在引用的生命周期内保持,除非下面指定...

构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出。临时绑定到引用 函数调用(5.2.2)中的参数一直持续到包含调用的完整表达式完成为止。函数返回语句(6.6.3)中返回值的临时绑定一直持续到函数退出

答案 1 :(得分:3)

执行您所做的事实际上在编译器内部执行此操作:

const std::string* ClassName::MethodName() const
{
   std::string temp = "";
   return &temp;
}

返回引用或指向局部变量的指针很糟糕。

答案 2 :(得分:2)

这是一个让我明白的例子:

#include <iostream>
using std::cout;
struct A{
   A()   {
      cout << "Ctor\n";
   }
   ~A()   {
      cout << "Dtor\n";
   }
};

const A& f(){
   return A();
}

int main(){
   const A& ref = f();
   cout << "1\n";
   {
      const A& ref1 = A();
      cout << "2\n";
   }
   cout << "3\n";
}

<强>输出

Ctor
Dtor
1
Ctor
2
Dtor
3

答案 3 :(得分:2)

在某些情况下,此代码是安全的。请参阅GotW #88: A Candidate For the “Most Important const”