Mit variablen Templates, die in C ++ 14 kommen (und Clang unterstützt sie bereits) und einem Vorschlag für Standard is_same_v
und ebenfalls Typeigenschaften, dachte ich, dass ich in der Lage wäre, neue Typmerkmale wie folgt zu erstellen:
Leider führt dies zu Fehlern, die der folgenden SSCCE entsprechen ( diese enthält alles, was unten erwähnt wird):
%Vor% Wenn die Zeile in main
kommentiert wird, spuckt Clang Folgendes aus:
Warnung: Variable
is_pointer<type-parameter-0-0>
hat interne Verknüpfung, ist aber nicht definiert
Es sieht für mich so aus (beachten Sie, dass das Ändern von T
in int *
in foo
einwandfrei funktioniert). Wenn Sie die Zeile in main
auflösen, um foo
zu instanziieren, erhalten Sie (auch hier: T
bis int *
funktioniert):
Fehler: constexpr Variable
foo<int *>
muss durch einen konstanten Ausdruck initialisiert werden
Wenn jedoch foo
durch die folgende alte Syntax ersetzt wird, funktionieren beide Instanzen einwandfrei:
Gibt es etwas, das mir an variablen Vorlagen fehlt? Gibt es eine Möglichkeit, neue variable Vorlagen mit ihnen zu erstellen, oder bin ich gezwungen, die ältere Syntax zu verwenden, um neue zu erstellen und genieße nur den syntaktischen Zucker, wenn ich sie für anderen Code verwende?
Ihr Code ist gültig und wird von SVN akzeptiert. Der Link-Fehler wurde verursacht durch Clang Bug 17846 , was ich fixed vor ein paar Tagen .
Folgendes scheint zu funktionieren:
%Vor% Obwohl es die gleiche Warnung gibt, wenn es in einem constexpr
Kontext verwendet wird, nehme ich an, dass es nicht wirklich funktioniert.
Es hört auf sich zu beschweren, wenn Sie foo
einen expliziten Typ geben:
Oder benutzen Sie einfach test<T>::is_pointer
direkt:
Tags und Links c++ c++14 variable-templates