2017-02-03 20 views
16

Dzisiaj natknąłem się na następujący problem. Ktoś trochę zbyt lubił inicjatorów nawiasów klamrowych i przypadkowo próbował utworzyć instancję klasy interfejsu. Pokrywa się ze mną:Przypadkowo "stwórz" abstrakcyjny typ klasy przy użyciu inicjatorów nawiasów klamrowych?

#include <iostream> 

class IFoo 
{ 
public: 
    virtual ~IFoo() = default; 
    virtual bool getFoo() const = 0; 
}; 

void processFoo(const IFoo &fooImpl) 
{ 
    bool foo = fooImpl.getFoo(); 
    std::cout << "got foo " << foo << std::endl; 
} 

int main() 
{ 
    processFoo({}); // <- why is this valid?! 
    return 0; 
} 

Do tej pory spodziewał I że kompilator wyda komunikat o błędzie podobny do nich można uzyskać, gdy próbuje coś głupiego jak wywołanie IFoo() lub IFoo{}. Jednak powyższy kod kompiluje się bez ostrzeżenia (na gcc 6.2), ale oczywiście kończy się na "czystej wirtualnej metodzie o nazwie" zaraz po próbie wywołania metody getFoo(). Live example.

Czy ktoś mógłby mi wyjaśnić, co się tam dzieje?

+3

Wygląda na to, że jest to defekt g ++. –

+2

gcc 5.1 kompiluje uproszczony główny 'int main() { const IFoo & foo = {}; return 0; } 'Niestety nie można sformatować komentarzy. ... także 'const IFoo & foo {}; 'kompiluje –

+0

@djf wygląda jak clang 5.0.0 HEAD poprawnie przechwytuje ten błąd z testowania na [kompilatorze online melpona] (http://melpon.org/wandbox/). – greatwolf

Odpowiedz

5

To jest known GCC bug. Niestety, problem jest nadal otwarty i nie jest przypisany do nikogo, jak się wydaje.

+0

Muszą czekać na to, by standard przyjął jakieś domyślne instancjonowanie i dowody Scala, aby ogłosić to jako cechę. – bipll

+0

Dzięki za przekopanie tego łącza, Christian. Szukałem znanych problemów, ale nie znalazłem nic istotnego:) – djf