2016-05-10 4 views
0

Ich habe einige einfache C++ - Codes, die nicht vom Clang-basierten C++ 11-Compiler bccaarm von C++ Builder 10.1 Berlin kompiliert werden.C++ Builder bccarm Fehler beim Aufrufen von std :: vector :: push_back mit TObject-Nachfolger

Dies ist der Code:

TComponent* Comp = new TComponent(this); 
std::vector<TComponent*> Comps; 
Comps.push_back(Comp); 

Und das ist der Fehler:

[bccaarm error] stl_iterator.h(963): rvalue reference to type 'value_type' (aka 'System: classes::TComponent * __strong') can not be bound to lvalue of type '__borland_class * isTObj __strong' (aka 'System::Classes::TComponent * __strong')

Der Compiler in Zeile stoppt 963 in der Datei stl_iterator.h:

Screenshot of IDE

Die anderen C++ - Compiler bcc32 und bcc32c (auch Clang-basiert) haben kein Problem ems mit diesem Code.

Wenn Comp nicht vom Typ TComponent oder einem anderen Nachkommen von TObject ist, wird der Code ohne Probleme kompiliert.

Ich habe keine Ahnung, was mit diesem Code falsch ist und warum gibt es ein Problem mit R und L-Werten ...

Weiß jemand, was hier zu tun?

+1

Die englische Übersetzung so etwas wie dieses würde: ' [bccaarm error] stl_iterator.h (963): rvalue-Verweis auf den Typ 'value_type' (auch bekannt als 'System: classes :: TComponent * __strong') kann nicht an lvalue vom Typ '__borland_class * isTObj __strong' gebunden werden (alias 'System: : Classes :: TComponent * __strong ') 'Die mobilen Compiler, wie bccaarm, implementieren Object ARC (dort kommt der' __strong' zum Einsatz), bu t die Desktop-Compiler nicht, weshalb der Code in bcc32 und bcc32c kompiliert. –

+1

Ich würde erwarten, dass dieser Code unter ARC gut kompiliert, obwohl ich es seltsam finde, dass 'std :: vector :: iterator :: operator *' 'std :: move()' überhaupt verwendet. Der Operator soll eine Referenz auf ein existierendes Element in dem Vektor zurückgeben, es sollte keine Bewegung involviert sein. Vielleicht ein STL-Fehler? –

+0

@RemyLebeau: Hinzufügen von __unsafe half (siehe Antwort), aber es ist immer noch nicht klar, ob es einen Fehler in der STL gibt ... –

Antwort

0

Um den obigen Code kompiliert zu bekommen, muss der Vektortyp als unsicherer Zeiger definiert werden.

TComponent* Comp = new TComponent(this); 
std::vector<__unsafe TComponent*> Comps; 
Comps.push_back(Comp); 

Ich öffnete einen Support-Fall für ein anderes Problem, das ich hatte. Die embarcadero Unterstützung gab mir die folgenden Informationen, die ich für dieses Problem angewendet und es scheint zu funktionieren:

__unsafe tells the compiler that object lifetimes will be handled and no ARC code is generated for the objects

Mehr zu diesem Thema:

http://docwiki.embarcadero.com/RADStudio/Berlin/en/Automatic_Reference_Counting_in_C%2B%2B#weak_and_unsafe_pointers