临时对象的成员函数的左值引用返回是否为悬空引用
Is the lvalue reference return of a member function of a temporary object a dangling reference?
有一个类CBase
。
class CBase
{
...
CBase &Create()
{
return *this;
}
...
}
如果我声明一个左值引用和一个指针,
CBase &kk = CBase().Create();
CBase *pp = &( CBase().Create() );
kk
是一个悬空的参考,pp
是一个悬空的指针吗?
我认为kk
和pp
都在晃来晃去。因为调用CBase()
无疑会创建一个临时对象,所以导数CBase().Create()
也应该如此。但是,Xcode(版本 6.1)不会给出警告或错误消息。
谁能给出一些提示或告诉我 C++11 文档在哪里描述了这些行为?还是我错了?
是的,kk
是一个悬空的引用,pp
是一个悬空的指针。CBase()
生成的临时仅在它出现的完整表达式的持续时间内存在。请注意,让指针或引用引用此对象仍然有效,只要它们的生存期也绑定到表达式。
由于kk
和pp
在完整表达式之后仍然存在,因此情况并非如此。使用 kk
和取消引用pp
具有未定义的行为。
相关文章:
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 形成对对象的引用是否构成访问?
- C++ 引用是否在需要时隐式转换为值?
- 右值引用是否具有与右值引用相同的开销?
- 返回引用是否也会延长其生存期?
- 返回对局部变量的引用是否正常工作?
- 右值引用是否像右值引用一样工作
- 强制转换为指针引用是否会导致未定义的行为
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 结构化绑定和转发引用是否混合良好?
- 此常量引用是否保留了其生命?
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- 在 C++ 中更改越界指针的取消引用是否安全?
- 本地引用是否由"DetachCurrentThread"清除?
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- 常量右值引用是否允许对编译器进行额外优化?
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 返回强制引用是否安全