我刚刚在工作中构建我们的一个项目,我看到添加了一个新功能:
const std::string& ClassName::MethodName() const
{
return "";
}
编译器给出警告:
警告 C4172:返回局部变量或临时地址
我认为编译器是对的。这个功能有多安全?
请注意,该函数不会返回const char*
,因为字符串文字具有静态存储持续时间。它返回一个引用const std::string
我刚刚在工作中构建我们的一个项目,我看到添加了一个新功能:
const std::string& ClassName::MethodName() const
{
return "";
}
编译器给出警告:
警告 C4172:返回局部变量或临时地址
我认为编译器是对的。这个功能有多安全?
请注意,该函数不会返回const char*
,因为字符串文字具有静态存储持续时间。它返回一个引用const std::string
是的,它不安全。
返回局部变量或临时变量的地址并取消引用它会导致未定义的行为。
正如您所评论的:
是的,临时绑定到常量引用的生命周期会增加,直到常量的生命周期。但这需要调用者接受 const 引用中的返回值,所以函数本身并不安全。
来自 C++ 标准:
C++03 12.2 临时对象:
第二个上下文是引用绑定到临时的。引用绑定到的临时对象或作为临时对象绑定的子对象的完整对象的临时对象将在引用的生命周期内持续存在,除非以下指定...
临时绑定到构造函数的 ctor-initializer (12.6.2) 中的引用成员将持续存在,直到构造函数退出。在函数调用 (5.2.2) 中对引用参数的临时绑定将持续存在,直到包含调用的完整表达式完成为止。在函数返回语句 (6.6.3) 中对返回值的临时绑定将持续存在直到函数退出
这是一个让我明白的例子:
#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
在编译器内部执行您实际执行的操作:
const std::string* ClassName::MethodName() const
{
std::string temp = "";
return &temp;
}
并且返回对局部变量的引用或指针是不好的。