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?
Wygląda na to, że jest to defekt g ++. –
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 –
@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