我刚刚在工作中构建了一个项目,我看到添加了一个新功能:
const std::string& ClassName::MethodName() const { return ""; }
编译器发出警告:
Warning C4172: returning address of local variable or temporary
我认为编译器是对的.这个功能有多安全?
请注意,该函数不会返回const char *,因为字符串文字具有静态存储持续时间,所以它是正常的.它返回对const std :: string的引用
解决方法
是的,这不安全.
返回局部变量或临时变量的地址并取消引用它会导致未定义的行为.
返回局部变量或临时变量的地址并取消引用它会导致未定义的行为.
正如你评论的那样:
是的,临时绑定到常量引用的生命周期增加到常量的生命周期.但是这需要调用者接受const引用中的返回值,因此该函数本身不安全.
从C标准:
C 03 12.2临时物体:
第二个上下文是引用绑定到临时的.引用绑定的临时对象或作为临时绑定的子对象的完整对象的临时对象在引用的生命周期内持续存在,除非下面指定…
绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出.临时绑定到引用函数调用(5.2.2)中的参数一直持续到包含调用的完整表达式完成为止.函数返回语句(6.6.3)中返回值的临时绑定一直存在,直到函数退出