Dav*_*ave 6 c++ virtual-functions temporary pure-virtual
据我了解临时代码,以下代码应该可以工作,但事实并非如此.
struct base
{
virtual~base() {}
virtual void virt()const=0;
};
struct derived:public base
{
virtual void virt()const {}
};
const base& foo() {return derived();}
int main()
{
foo().virt();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对virt()的调用给出了一个"纯虚函数调用"错误.为什么这样,我该怎么办?
当函数在return语句结束时结束并且您得到未定义的行为时,您将返回对临时的引用.
你不能返回任何类型的临时引用,如果你返回一个base值,你会得到切片,所以如果你真的希望这个工作,你应该返回一个std::unique_ptr<base>.
看起来你期望const引用延长临时的生命周期.在某些情况下,这种情况不会发生.其中一种情况是返回临时时:
第二个上下文[其中temporaries在与完整表达式的结尾不同的点被销毁]是指引用绑定到临时的.绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:
[...]
- 函数返回语句(6.6.3)中返回值临时绑定的生命周期未扩展; 临时在return语句中的full-expression结束时被销毁.
由于调用返回的对象的成员函数foo()将需要进行左值到右值的转换并且对象无效(不是从类型派生base),因此会得到未定义的行为:
如果glvalue引用的对象不是类型的对象,
T并且不是派生类型T的对象,或者如果对象未初始化,则需要此转换的程序具有未定义的行为.
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |