【发布时间】:2016-08-29 06:19:47
【问题描述】:
以下代码在各种 gcc 和 clang 版本上编译 - 当使用 gcc 5.3.1 编译和运行时,它会打印
A()
然后以纯虚拟调用错误中止。
#include <stdio.h>
class A
{
public:
A() {
printf("A()\n");
}
virtual void b() const = 0;
};
int main()
{
const A& a{};
a.b();
return 0;
}
我意识到将引用绑定到临时对象并不理想(尽管我认为这种情况已被某种生命周期延长所涵盖) - 但在尝试调用采用常量引用如:
Foo({});
为方便起见,这里是使用 clang 3.2 编译的示例:Compiler Explorer
【问题讨论】:
-
允许通过指针或引用构造抽象类,记得吗?
-
@DeiDei 我不记得了,但它会解释原因。编辑:要清楚,它实际上是在构造一个对象,而不仅仅是一个引用。
-
@Soren 当您将临时对象绑定到 const 引用时,临时对象的生命周期会延长到引用的生命周期。
-
@DeiDei 我也不记得了,我在网上找到的参考页面似乎是相反的。你能暗示一下如何找到这方面的文档吗?
-
@DeiDei:为了将临时对象绑定到引用,您必须首先构造一个临时对象。这需要构造一个该类型的对象。并且您不允许构造抽象类类型的完整对象。那么在哪里说你可以构造一个
A类型的临时对象?
标签: c++ gcc clang abstract-class pure-virtual