在指针解除引用时返回对本地临时对象的引用
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 的警告不正确。
让我们逐步了解这里发生的事情:
static const int ARRAY[4] = {1, 2, 3, 4};
构造一个全局数组int
s
return &ARRAY[0];
returns 指向全局数组第一个元素的指针
const auto& p = Get()
存储对指向全局数组第一个元素的指针的引用
return (*p);
创建对全局数组第一个元素左值的引用
4 是棘手的。 Clang 似乎错误地认为 *p
是局部值,而实际上我们知道它是全局值。
这个证明的关键是 the fact that *p
returns an lvalue。
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 的警告不正确。
让我们逐步了解这里发生的事情:
static const int ARRAY[4] = {1, 2, 3, 4};
构造一个全局数组int
sreturn &ARRAY[0];
returns 指向全局数组第一个元素的指针const auto& p = Get()
存储对指向全局数组第一个元素的指针的引用return (*p);
创建对全局数组第一个元素左值的引用
4 是棘手的。 Clang 似乎错误地认为 *p
是局部值,而实际上我们知道它是全局值。
这个证明的关键是 the fact that *p
returns an lvalue。