'auto' ist nicht zulässig in Funktion Prototyp mit Clang
Mit Clang 3.5, 3.6 oder 3.7, mit der fahne std=c++1y
den folgenden code nicht kompiliert :
#include <iostream>
auto foo(auto bar) { return bar; }
int main() {
std::cout << foo(5.0f) << std::endl;
}
Den Fehler gegeben ist :
Fehler: 'auto' nicht zulässig in Funktion Prototyp
Ich habe keine Fehler mit g++ - 4.9.
Ist dieser Fehler produziert, weil das Geräusch noch nicht umgesetzt functionnality noch oder ist es weil ich bin nicht berechtigt das zu tun und GCC irgendwie ist es erlaubt ?
- Ich denke, man sollte das nicht tun, da Sie es außerhalb des Bereichs.
auto
Funktion Parameter der normalen (non-lambda) Funktionen sind eine Erweiterung von Konzepten TS. Sie sind nicht Teil von C++14, die ist, was C++1y wurde.- Btw, es gibt einen(n-inoffizielle?) clang ast, die es unterstützt. Einige Diskussionen finden Sie auf der std-Diskussion-Mailingliste. Ich weiß nicht, was der aktuelle status des Zweiges, obwohl.
- BTW C++14 ist, so dass Sie verwenden sollten
-std=c++14
(und aktualisieren, wenn Ihr compiler nicht, dass der Schalter). Die nächste version ist vorläufig alsc++1z
. - gcc 4.9.x kann gebaut werden mit Konzepten, die wahrscheinlich ist, warum Sie es sehen.
- Danke für Eure Ratschläge. Mit c++1y ist daher veraltet ?
- es war nie Teil eines Standards, so dass wir würde nicht nennen es veraltet, aber es macht keinen Sinn, es zu benutzen, es sei denn, Sie sind stecken mit einem alten compiler
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie wir sehen, von der ISO-C++ Diskussion mailing: decltype(auto) Parameter vs. perfect forwarding auto Parameter von nicht-lambdas ist Teil Konzepte lite und daher nicht im C++14:
Wenn wir die -pedantic Flagge mit
gcc
erhalten wir die folgende Warnung:So sieht es aus wie eine Verlängerung.
Als dyp darauf hingewiesen, der polymorphe Lambda-Ausdrücke habe es in C++14 und ermöglichen die automatische Parameter, wird ein Beispiel aus dem Papier:
Ist übrigens die gleiche Funktionalität, die Sie implementieren möchten, in Ihrem Beispiel.
-pedantic
zwingt den compiler-Warnungen für Erweiterungen, im Grunde alles, was nicht erlaubt von der Norm.Obwohl Ihre spezifische syntax nicht C++14, eine ähnliche option, die Sie haben ist:
welche erreicht im Grunde die gleiche Sache.
static auto
?foo
hat interne Verlinkung, d.h. es ist nicht zugänglich mit Namen von anderen Einheiten. Dies verhindert, dass versehentliche Undefiniertes Verhalten, wenn eine andere Datei gingint foo = 5;
zum Beispiel. Es würde nicht viel Sinn ergeben, verwenden Sie externe Verknüpfung hier, weil Sie nicht schreiben können eine Erklärung für ein lambda (andere als die tatsächliche definition), so dass keine andere Einheit in der Lage wäre, richtig zu verwenden es trotzdem.Können Sie eine Vorlage verwenden, statt:
Auto ist nur erlaubt, wenn der Compiler kann Rückschlüsse auf die Art aus dem Zusammenhang.
Der compiler kann den Typ abzuleiten aus dem Kontext.
Was ist falsch mit dem tun
muss und Sie passieren
bar
von Wert?In Ihrem Fall können Sie die trailing return type syntax:
auto foo(auto bar) -> decltype(bar)
->
erlaubt ist in C++14)