在指针取消引用时返回对本地临时对象的引用
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引用(已绑定到临时引用),而不考虑它们的使用方式。
回答:Clang的警告不正确。
让我们来看看这里发生了什么:
static const int ARRAY[4] = {1, 2, 3, 4};
构建int
的全局数组return &ARRAY[0];
返回指向全局数组的第一个元素的指针const auto& p = Get()
存储对指向全局数组的第一个元素的指针的引用return (*p);
创建对全局数组的第一个元素的左值的引用
4是个棘手的问题。Clang似乎错误地认为*p
是局部值,而事实上我们知道它是全局值。
这个证明的关键是*p
返回一个左值。
相关文章:
- 为什么当我们有常量引用时创建临时对象?
- 返回对临时对象的引用
- 通过引用传递临时对象
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 对临时对象的Const引用不会延长其生存期
- 为什么引用类型在使用临时对象访问时是左值
- 取消引用临时对象上的运算符
- 常量引用函数参数:是否可以禁止临时对象?
- 为什么临时对象可以绑定到常量引用?
- 为什么常量引用不能延长通过函数传递的临时对象的生存期?
- 使用常量引用延长临时对象的寿命
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- 关于将临时对象传递给常量引用
- 将临时对象绑定到常量引用
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)
- 返回对本地临时对象 C++ 的引用
- 模板类型推导警告返回对本地临时对象的引用
- 为什么不对临时对象进行非常量引用
- 为什么我们可以非常量引用临时对象并延长其生命周期
- C++悬空的常量引用临时对象