繁体   English   中英

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

[英]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;
}

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

答: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返回一个左值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM