Sortieren mit std::function als Vergleichsfunktion



  • Hallo,

    ich habe ein Problem 😞

    Und zwar habe ich Code, der einen vector mithilfe einer benutzerdefinierten Vergleichsfunktion sortiert. Diese Funktion kann man übergeben. Aus bestimmten Gründen (die inzwischen eigentlich nicht mehr gelten) hatte ich das mit einer std::function implementiert statt als Template.

    Das Problem ist nun, dass das bei clang nicht mehr kompiliert mit -std=c++14. Mit -std=c++11 geht es.
    Bei gcc dagegen kompiliert es mit allen von -std=c++11/14/17.

    Ist das ein Bug in clang oder geht das so nicht?
    Siehe https://godbolt.org/g/LUrjo1

    Alternativ hier der Code:

    #include <algorithm>
    #include <functional>
    #include <vector>
    
    using namespace std;
    
    void doesntCompile(std::function<bool(int, int)> compare) {
        vector<int> order(20);
        sort(begin(order), end(order), compare);
    }
    
    int main() {
        doesntCompile([](int a, int b) { return a < b; });
    }
    


  • Gibts eine Fehlermeldung vom Compiler dazu?


  • Mod

    axels. schrieb:

    Gibts eine Fehlermeldung vom Compiler dazu?

    https://godbolt.org/g/LUrjo1



  • Benutzt clang immer die gcc-header?



  • Ah! Danke manni66 für die Idee. Mit -stdlib=libc++ kompiliert clang es auch mit -std=c++14.

    Hier hört aber definitiv meine Kenntnisse über die Interna der Compiler/stdlibs auf. Von daher kann ich manni66s Frage nicht beantworten. Müsste/sollte es denn eigentlich auch ohne den stdlib-Switch kompilieren?

    Ich verwende den Code normalerweise mit ROOT, der jitted das C++. Keine Ahnung, ob ich da irgendwie die stdlib ändern kann/will/sollte - das wird ja bestimmt weitere Nebeneffekte haben. Müsste ich dann wohl mal im entsprechenden Forum fragen. Vielleicht ist das auch eine Erklärung, warum standardmäßig ROOT noch ohne C++14 gebaut wird.


Log in to reply