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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage