在指针解除引用时返回对本地临时对象的引用

returning reference to local temporary object on pointer dereferencing

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;
}

据推测,如果 return 类型是引用,Clang 会在 returned 表达式中查找常量引用(已绑定到临时对象),而不考虑它们的使用方式.

答案:Clang 的警告不正确。

让我们逐步了解这里发生的事情:

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

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

这个证明的关键是 the fact that *p returns an lvalue