auto function parameters



  • dachte bislang, dass auto als function parameter nur bei generic lambdas zulässig ist, allerdings bemerkte ich eben, dass sowas wie

    void setB(auto& pointerToB) {
    }
    

    ohne Weiteres geht in C++17. Ist mir da was entgangen?



  • @sewing
    Benutzt du g++ mit concepts?



  • Compiler?
    Bei gcc: kompiliere mit -Wpedantic:

    g++ -c auto.cpp -std=c++17 -Wpedantic
    auto.cpp:2:10: warning: ISO C++ forbids use of ‘auto’ in parameter declaration [-Wpedantic]
     void foo(auto &x) {std::cout << x;}
              ^~~~
    

    Aber g++ (7.3.0) schluckt es trotzdem, ist ja nur eine Warnung. Ist wohl eine geplante Erweiterung.

    clang kompiliert den Code dagegen nicht:

    clang++-7 -c auto.cpp -std=c++17                                     
    auto.cpp:2:10: error: 'auto' not allowed in function prototype
    void foo(auto &x) {std::cout << x;}
             ^~~~
    1 error generated.
    

    Edit: g++-Version ergänzt.



  • @wob sagte in auto function parameters:

    Aber gcc schluckt es trotzdem, ist ja nur eine Warnung. Ist wohl eine geplante Erweiterung

    auto.cpp:1:15: warning: use of ‘auto’ in parameter declaration only available with -fconcepts

    Mit g++ 8.1 und -Wall -std=c++17 -pedantic -Wextra



  • -Wall verwende ich zu Lernzwecken

    verstehe auch nicht, was das mit concepts zu tun haben soll...

    bald stehen nirgendwo mehr dedizierte Typenbezeichner sondern nur noch auto xD



  • @sewing sagte in auto function parameters:

    -Wall verwende ich zu Lernzwecken

    ?

    verstehe auch nicht, was das mit concepts zu tun haben soll...

    Cocepts (wie es im g++ implementiert ist) definiert das als

    template <typename T> void setB(T& pointerToB) {
    }
    


  • @sewing sagte in auto function parameters:

    verstehe auch nicht, was das mit concepts zu tun haben soll...

    Hat mit Concepts insofern zu tun, als erst n4040 auto in Parameterlisten von Funnktionsdeklarationen erlaubt. (Generic Functions)



  • @sewing sagte in auto function parameters:

    -Wall verwende ich zu Lernzwecken

    -Wall verwendet man am besten IMMER. Wieso zu "Lernzwecken"?

    Ich verwende auch -Wextra und -Wpedantic immer (zumindest wenn ich nicht gerade von Kommandozeile von Hand compiliere)



  • wie ist denn die Abstufung bei Wall, WExtra und WPedantic?

    ich frage mich, wozu es dann noch function templates braucht, wenn man sogar hier schon auto verwenden kann



  • @sewing sagte in auto function parameters:

    wie ist denn die Abstufung bei Wall, WExtra und WPedantic?

    Google selbst, fauler Sack!

    //edit: spoon feeding ... Invoking GCC - 3.8 Options to Request or Suppress Warnings



  • ich frage mich, wozu es dann noch function templates braucht, wenn man sogar hier schon auto verwenden kann



  • Wie hilft Dir auto als Parametertyp, wenn Du non-type-template Parameter willst oder template-template Parameter?



  • template<auto n>
    void foo();
    

    für function templates mit reinen template parametern sehe ich damit jedenfalls keine berechtigung mehr



  • Du hast gefragt, wofür man noch template braucht, ... jetzt hast du dir die Antwort ja selbst gegeben.



  • ich wollte nur eine Bestätigung dafür habe, dass einfache function templates mit template parametern damit ausgedient haben. Ich lese momentan das Buch C++ Templates, the complete guide, 2nd Edition und da wird als motivierendes Einführungsbeispiel der folgende Snippet präsentiert

    template<typename T1, typename T2>
    std::common_type_t<T1, T2> compare(T1 t1, T2 t2) {
      return t2 < t1 ? t2 : t1;
    }
    

    so wie ich das sehe kann ich einfach schreiben

    auto cmp(auto s1, auto s2) {
      return s1 < s2 ? s1 : s2;
    }
    

    ohne jeglichen Nachteil


  • Mod

    Obige Syntax wird so nicht in C++20 aufgenommen werden. Das Komitee ist sich überwiegend einig, dass Funktionstemplates als solche auch syntaktisch erkennbar sein müssen. Du wirst also künftig mindestens ein template vor deine ganze Definition stellen müssen (was natürlich momentan von keinem Compiler geschluckt wird). Ein aktuelles Paper dazu wäre P1079.

    Darüberhinaus ist common_typenicht exakt äquivalent zu dem Typ einer conditional expression.



  • aber es funktioniert doch schon, oder wird diese Compiler Funktion künftig dann wieder abgeschafft?



  • @sewing sagte in auto function parameters:

    aber es funktioniert doch schon, oder wird diese Compiler Funktion künftig dann wieder abgeschafft?

    Der g++ enthält die Testimplementierung. Concepts wird es in C++20 geben, aber die verkürzte Schreibweise wird wohl etwas anders aussehen.


  • Mod

    @sewing sagte in auto function parameters:

    aber es funktioniert doch schon, oder wird diese Compiler Funktion künftig dann wieder abgeschafft?

    Ja, so läuft es doch immer. Heutzutage sind Clang und GCC so gut dabei, dass sie TSe implementieren, die noch nicht einmal in einer vorläufigen Endform zu haben sind. Viele der Features werden dann gestrichen, sobald das Komitee sie ablehnt. Ein Klassiker war terse range-based for. Concepts wurden nicht in C++17 aufgenommen, weil sie noch halbgar sind, aber die Compiler bieten bereits Testversionen an, um ihre vorläufigen Implementierungen zu polieren und die User mit der facility vertraut zu machen—und natürlich nicht zuletzt, weil eine Implementierung auf Basis der Spezifikation wichtig ist, um das Komitee zu überzeugen, dass es damit praktische Erfahrung gibt. Kurz: ich würde keinen Code mit dieser Syntax verfassen.


Log in to reply