Warum erlauben mir gcc und clang, eine abstrakte Klasse zu konstruieren?
Der folgende Code wird auf einer Vielzahl von gcc- und clang-Versionen kompiliert. Wenn er mit gcc 5.3.1 kompiliert und ausgeführt wird, wird @ ausgegebe
EIN(
then bricht mit einem reinen virtuellen Anruf ab.
#include <stdio.h>
class A
{
public:
A() {
printf("A()\n");
}
virtual void b() const = 0;
};
int main()
{
const A& a{};
a.b();
return 0;
}
Ich erkenne, dass es nicht ideal ist, einen Verweis auf eine temporäre Adresse zu binden (obwohl ichdenke Dieser Fall wird durch eine Art Lebensdauerverlängerung abgedeckt) - funktioniert aber auch, wenn versucht wird, eine Methode aufzurufen, die eine const-Referenz wie folgt verwendet:
Foo({});
Der Einfachheit halber hier ein Beispiel für das Kompilieren mit Clang 3.2:Compiler Explorer