In einer sehr einfachen Situation mit, die Prüfung für die Konvertierbarkeit des Arguments, wird ein Fehler in Klirren produziert, aber nicht in g ++:Kein Mitglied benannten Wert in std :: is_convertible, wenn sie mit einem eingeschränkten Konstruktor Klirren
#include <type_traits>
template <class T, class U>
constexpr bool Convertible = std::is_convertible<T,U>::value && std::is_convertible<U,T>::value;
template <class T>
struct A
{
template <class S, class = std::enable_if_t<Convertible<S,T>> >
A(S const&) {}
};
int main()
{
A<double> s = 1.0;
}
Vielleicht ist das Problem
Der Fehler Klirren gibt zu Is clang's c++11 support reliable? bezogen, lautet:
error: no member named 'value' in 'std::is_convertible<double, A<double> >'
constexpr bool Convertible = std::is_convertible<T,U>::value && std::is_convertible<U,T>::value;
~~~~~~~~~~~~~~~~~~~~~~~~~~^
ich habe versucht
- g ++ - 5,4, g ++ - 6,2 (kein Fehler)
- Klappern ++ - 3.5, Klappern ++ - 3.8, Klappern ++ - 3.9 (Fehler)
mit Argumente -std=c++1y
und für clang entweder mit -stdlib=libstdc++
oder -stdlib=libc++
.
Welcher Compiler ist korrekt? Ist es ein Fehler in clang oder gcc? Oder ist das Verhalten aus bestimmten Gründen nicht definiert und somit beide Compiler korrekt?
Vielen Dank! Das erklärt mir sehr viel. Das "Catch-All" -Argument und der Konstruktionspfad waren für mich die Erkenntnis und führten zu einer Lösung in einem viel größeren Kontext (Der ursprüngliche Code enthält viele verschiedene Vorlagenkonstruktoren, so dass der Fehler-Nachrichten-Ansatz nicht eingreifen konnte) – spraetor
So * Warum * Ist 'std :: is_convertible>' Haben Sie kein ':: value' Member? Ich dachte, dass es ein "Wert" -Mitglied haben soll, das "falsch" ist? –
Ich denke ich sehe jetzt. Ich denke, dass es für die Implementierung von 'std :: is_convertible>' notwendig ist, zu testen, ob der Konstruktor von 'A ' ein 'double' akzeptiert, das rekursiv die Implementierung von' std benötigt: : is_convertible > 'in einer eigenen Definition, an welcher Stelle der Fehler auftritt, weil' std :: is_convertible > 'selbst dort unvollständig ist. –