在指针取消引用时返回对本地临时对象的引用

returning reference to local temporary object on pointer dereferencing

本文关键字:引用 临时对象 返回 指针 取消      更新时间:2023-10-16

Clang编译器在编译此代码片段时产生警告,我不知道为什么。

const int* Get() {
    static const int ARRAY[4] = {1, 2, 3, 4};
    return &ARRAY[0];
}
const int& Test() {
    const auto& p = Get();
    return (*p);
}
warning: returning reference to local temporary object [-Wreturn-stack-address] 
    return (*p);

GCC对此代码没有显示任何警告。我可以修复这样的代码片段:const auto p = Get(); 但我想知道是否有一些临时对象,问题是否在更深层次的

该警告为假阳性,因为p的指针对象不是临时的,尽管p指的是一个。在更多的情况下,这种警告是虚假产生的;参见Bug 21218,它使用

char * f() {
    typedef char* t;
    const t & r = new char[5];
    return r;
}

据推测,如果返回类型是引用,Clang会在返回的表达式中查找const引用(已绑定到临时引用),而不考虑它们的使用方式。

回答:Clang的警告不正确。

让我们来看看这里发生了什么:

  1. static const int ARRAY[4] = {1, 2, 3, 4};构建int的全局数组
  2. return &ARRAY[0];返回指向全局数组的第一个元素的指针
  3. const auto& p = Get()存储对指向全局数组的第一个元素的指针的引用
  4. return (*p);创建对全局数组的第一个元素的左值的引用

4是个棘手的问题。Clang似乎错误地认为*p是局部值,而事实上我们知道它是全局值。

这个证明的关键是*p返回一个左值。