2017-03-10 3 views
1

bemerkte ich, dass der Abschnitt 18.8/1 in C++ 11 und ++ 14-Standards C die folgende Erklärung in der <exception> Header Übersicht enthalten:Wie definiert der C++ 1z-Standard die korrekte Position von Attributen in einer Template-Funktionsdeklaration?

[[noreturn]] template <class T> void throw_with_nested(T&& t); 

während in der neuesten ++ 17 Entwurf C die gleiche Erklärung Heißt erscheint als

template <class T> [[noreturn]] void throw_with_nested(T&& t); 

dies, dass die Syntax für die Attribute hat C++ 17 geändert oder nur, dass die ehemalige Linie war ein Fehler, der korrigiert wurde? Ich kann keine klare Beschreibung finden, wo die Attribute für Funktionsvorlagen erscheinen sollen, weder in 7.6 noch in 14.5.6. Könnte jemand bitte darauf hinweisen, wo dies definiert ist?

Praktisch ist MSVC sowohl mit der ersten als auch mit der zweiten Deklaration zufrieden, während g ++ und clang sich weigern, die erste Version zu kompilieren (letztere mit der ziemlich expliziten error: an attribute list cannot appear here), also muss die zweite Version sowieso verwendet werden. Aber ich würde gerne wissen, ob der erste gültig ist oder ob er gültig ist oder nicht. Diese

Antwort

4

:

template <class T> [[noreturn]] void throw_with_nested(T&& t); 

war immer die einzig richtige Option. Rechtschreiblich, die Produktionen sind, aus verschiedenen Abschnitten [g]:

template-Deklaration:
        template<Templat-Parameterliste>Erklärung

Erklärung:
        [...]
        funktions Definition
        [...]

funktions Definition:
        Attribut- Spezifizierer-Seq optDecl-specifier-Seq optdeclarator virt-Spezifizierer-Seq optFunktion Körper

Die Attribute nach dem template <...> Einführungs gehen.


Es war nur eine Ausarbeitung Thema in dem Standard, wie Mr. Wakely von unserer eigenen eingereicht.

+1

Aber 'void throw_with_nested (T && t);' ist keine _funktionsdefinition_. Es ist eine _simple-deklaration_. (Die Schlussfolgerung ist jedoch die gleiche.) – cpplearner

Verwandte Themen