关于返回对临时参数的const引用
about returning a const reference to a temporary argument
我在Ubuntu下使用g++4.8.4进行编译。
我不明白为什么下面的代码工作正常意味着总是在控制台上打印一些输出而不会崩溃。
我认为函数foo()
被分配了一个临时对象,该对象将持续到函数foo()
完成执行为止。
当然,输出参数会指向堆栈上分配临时地址的同一地址,但我惊讶地发现,对A::hello()
的每次调用都很好。
我认为应该避免任何对该内存区域的访问。
我想用"valgrind"仔细检查一下,它也说一切都好。我试着用-Wstack-protector
重新编译,但什么都没有。
你知道为什么会这样吗?我的想法是错误的,还是这只是最好避免的"未定义"C++行为之一?
#include <iostream>
using namespace std;
struct A {
A(): a(10) { cout << "a" << endl; }
~A() {cout << "bye" << endl; }
void hello() const { cout << "hi " << a << endl; }
};
const A& foo(const A& a = A()) {
return a;
}
int main() {
for( int i = 0; i < 10 ; i++) {
const A& a = foo();
a.hello();
}
return 0;
}
Output
'a'
'bye'
'hi 10'
'a'
'bye'
'hi 10'
...
行为未定义。
将const
引用绑定到匿名临时对象会将该匿名临时对象的生存期延长到该const
引用的生存期。
但是,尝试在foo
中重新绑定返回的对a
的引用将不会延长生存期:生存期扩展不是可传递的。所以a
是main()
中的一个悬空引用。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 'HMODULE LoadLibraryA(LPCSTR)':无法将参数 1 从 'const _Elem *' 转换为 'LPCSTR'
- 将函数参数"const char*"转换为"std::string_view"是
- 将参数传递为"const"的奇怪效果
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- std::span<const T> 作为函数模板中的参数
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 何时应在构造函数参数中使用 const C++?
- 不允许运算符 const 参数调用 const 成员函数
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- 知道模板参数在编译时是否为 const char*?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 具有参数 (const T *&) 或 (T * &) 或 (const T * const &) 或 (T * const &) 的方法
- 为什么在函数参数前面添加 const 会出错?
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- C++ Boost - 序列化错误 - 将"const B"作为"this"参数
- C++ 我应该如何解释函数参数long(*pPointer)(OtherClass *const, long)?
- 什么..表示函数内部参数(const char*值,..)
- 如果参数创建本地副本,则使用参数"const [variable_type] &"的目的是什么?
- 候选函数不可行:第一个参数('const Node *')将失去常量限定符