C++ modules und star ship operator



  • Hallo zusammen,

    ich habe heute, nach längerer Zeit, mal wieder mit modules experimentiert.

    Ich habe Probleme, wenn ich einen Typen exportieren möchte, auf dem der Star Ship Operator spezifiziert ist und ich den Typen an einer Stelle importiere, die auch "altmodische" stl Header verwendet.
    Um ehrlich zu sein, immer wenn was stl spezifisches exportiert wird, wenn ich z.B. einen unique_ptr Member habe, habe ich das gleiche Problem.

    Wenn ich zum Beispiel eine Funktion exportiere, die eine stl Funktion aufruft, habe ich kein Problem (z.B std::cout).

    Hier Code zur Veranschaulichung:

    export module test;
    import std;
    
    
    
    export struct Test
    {
      double value{};
      auto operator<=>(const Test&) const = default;
    };
    
    export void test()
    {
      std::cout << "test\n";
    }
    

    und

    import test;
    #include <iostream>
    
    int main()
    {
      Test bla;
      test();
      return 0;
    }
    

    kompiliert mit VS 2022 (Version 17.8.3) nicht.

    Wenn ich entweder das #include <iostream> raus nehme, oder aber den Starship Operator, dann funktioniert das.

    Ist das ein Bug im Compiler, oder mache ich etwas falsch?

    Die Fehlermeldung ist: error C1117: unrecoverable error importing module 'std': symbol 'partial_ordering' has already been defined



  • Ich hatte Module vor einigen Monaten mit verschiedenen GCC 11.x und 12.x Versionen probiert. Meines Erachtens sind die Implementationen noch total instabil sobald man nicht trivialen Code übersetzen will. D.h. Du musst damit rechnen, dass Du alles nach ISO Norm korrekt formulierst, und der Compiler es trotzdem nicht annimmt.



  • import std; scheint MSVC only zu sein. import compare;funktioniert aber leider auch nicht. Wenn man die Headerdatei im global module fragment inkludiert funktioniert das:

    module;
    
    #include <compare>
    
    export module test;
    

    Ich habe heute vormittag versucht, das im Compiler Explorer nachzubauen um mal mit anderen Compilern zu experimentieren. Aber ich bekomme das auf die Schnelle mit Cmake und Ninja als Generator nicht hin. Soweit ich weiß, ist das aktuell die einzige Möglichkeit das ganze im Compiler Explorer halbwegs Crossplattform hinzubekommen.

    Sehr Schade, so ist eine schleichende Modernisierung nicht möglich. Man müsste direkt alles auf Modules umstellen. Vielleicht sollte man dem Feature auch noch etwas Zeit zur Reifung lassen.

    Edit: https://www.youtube.com/watch?v=Dk_C_E8AtRs&t=1990s "Major msvc limitation: mixing named modules and classic includes - standardese says it should work, but the compiler doesen't handle it, yet" (Stephan T. Lavavej)

    Leider finde ich weder hier: https://github.com/microsoft/STL/issues/1694 noch hier https://github.com/microsoft/STL/wiki/Changelog#vs-2022-179 was dazu.

    Edit 2: Um's genauer zu machen: import std; ist C++23 und wird aktuell nur von MSVC unterstützt.


Anmelden zum Antworten