QT std::vector C2440 error vs2017



  • Hallo,

    ich programmiere mit Qt 5.9.7.
    Einerseits mit Qt Creator 4.7.1 mit Visual Studio 2017 64bit compiler oder Visual Studio 2017 mit Qt Visual Studio Tools 2.2.2.

    Folgender Code läuft ohne Probleme in Visual Studio 2017 Konsole.

    Aber unter Qt im Qt Creator als C++ Konsolen Programm oder minimales QWidget Progamm, sowie in Visual Studio (Qt) erhalte ich den Compiler Error C2440:

    error C2440: "Initialisierung": "std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>" kann nicht in "std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>> &" konvertiert werden

    #include <iostream>
    #include <vector>
    
    int main()
    {
        std::vector<int> vec { 0,1,2,3 };
        for (auto& v = vec.begin(); v != vec.end(); v++)
        {
        }
    
        return 0;
    }
    

    Im Editor wird bei der Error Meldung in der Schleife das erste "vec" rot unterstrichen.

    Alle Programme wurden jeweils mit den Projekt Assistenten erstellt. Warum erhalte ich nur unter Qt den Error C2440:

    Grüße,
    mireiner



  • Debug/Release?

    for (auto& v => for (auto v



  • @manni66

    for (auto v : vec.begin()...) also ohne Referenz läuft der Code auch unter Qt.

    Ich möchte aber keine Kopie erzeugen und deshalb Referenzieren, weil es sich um einen Performance kritischen Programmteil handelt.

    Außerdem warum läuft das Referenzieren hier als reines C++ Konsolen Programm unter Visual Studio einwandfrei - unter Qt jedoch nicht?

    Getestet wurde im Debug mode.



  • Vertust du dich evtl. mit

    for (auto& x : vec)
    

    ?
    Es wird ja bei vec.begin() ein Iterator zurückgegeben:

    for (std::vector<int>::iterator v = vec.begin(); v != vec.end(); v++)
    

    Und da funktioniert keine Referenz!

    Benötigst du denn eine (nicht-konstante) Referenz oder möchtest du nur lesen?



  • @mireiner sagte in QT std::vector C2440 error vs2017:

    @manni66

    Ich möchte aber keine Kopie erzeugen und deshalb Referenzieren, weil es sich um einen Performance kritischen Programmteil handelt.

    Warum nimmst du an, dass eine Referenz schneller ist?

    Außerdem warum läuft das Referenzieren hier als reines C++ Konsolen Programm unter Visual Studio einwandfrei - unter Qt jedoch nicht?

    Wenn ich in VS den Schalter /permissive- benutze, erhalte ich die Fehlermeldung.

    Du kannst das von begin() erzeugte temporäre Objekt nur an ein const auto& binden. Diese Regel wid vom MS-Compiler bisher ignoriert und mit /permissive- standardkonform ausgelegt.



  • @manni66 sagte in QT std::vector C2440 error vs2017:

    Wenn ich in VS den Schalter /permissive- benutze, erhalte ich die Fehlermeldung.
    Du kannst das von begin() erzeugte temporäre Objekt nur an ein const auto& binden. Diese Regel wid vom MS-Compiler bisher ignoriert und mit /permissive- standardkonform ausgelegt.

    Danke für Deine Hinweise.

    Das hat das Rätsel für mich erst einmal gelöst und ich habe genug zum weiteren nachdenken.