Ich denke, dass (gewisse) implizite Konvertierungen gelten, wenn nicht-type Template-Parameter übergeben werden. Zum Beispiel sollte es eine Umwandlung von int
zu std::size_t
für Ausdrücke wie std::array<int, 7>
geben. Beachten Sie jedoch den folgenden Code:Wie die implizite Konvertierung für nicht typisierte Vorlagenparameter funktioniert?
template <bool>
void f() {
std::cout << "false\n";
}
template <>
void f<true>() {
std::cout << "true\n";
}
int main() {
f<1>();
f<4>();
f<0>();
}
Ich erwarte, dass int
implizit zu bool
hier umgewandelt werden. Aber die Verhaltensweisen unterscheiden sich in VC, GCC und Clang.
Auf VC, true
, false
und false
gedruckt werden, das ist wirklich komisch für mich.
Auf GCC, true
, true
und false
gedruckt werden, was ich erwarte.
Während des Klingelns kompiliert der Code aufgrund der Anweisung f<4>();
überhaupt nicht.
Kandidatenvorlage ignoriert: für die 1. Template-Parameter
Also, was macht den Standard sagt über diese explizit angegebenes Argument ungültig? Was ist die implizite Konvertierungsregel für nicht typisierte Vorlagenparameter?
Das VC-Verhalten ist zumindest klar: Es nimmt das LSB des Eingangsintegraltyps und verwendet diesen als booleschen Wert. Ich weiß immer noch nicht, welches Verhalten korrekt ist. –
@MarkB Nicht wirklich, 'f <3>();' druckt immer noch 'false'. – Lingxi