[英]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的警告不正确。
让我们逐步介绍一下这里发生的事情:
static const int ARRAY[4] = {1, 2, 3, 4};
构造一个int
的全局数组 return &ARRAY[0];
返回指向全局数组的第一个元素的指针 const auto& p = Get()
存储对指向全局数组的第一个元素的指针的引用 return (*p);
创建对全局数组的第一个元素的左值的引用 4是棘手的。 Clang似乎错误地认为*p
是本地值,而实际上我们知道它是全局的。
这个证明的关键是*p
返回一个左值 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.