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
-
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_type
nicht 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.
-
@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.