Warum akzeptiert weniger als der Bediener verschiedene Arten von Parametern während std :: min nicht?

8
%Vor% %Vor%

Danke chris kommentiert in Funktion Überladen Beitrag   Der Abzug von Vorlagenargumenten berücksichtigt keine Conversions. Ein   Vorlagenparameter kann nicht mit zwei Typen übereinstimmen

So std::min fehlgeschlagen.

Warum < funktioniert?

    
Kamel 11.08.2015, 08:08
quelle

5 Antworten

7

Weil das integrierte < Numerische Werbeaktionen und das Argumentabzug für die Vorlage nicht zutrifft t.

    
Quentin 11.08.2015, 08:16
quelle
3

Wie in anderen Antworten erklärt, liegt der Grund darin, dass std::min erfordert, dass die Typen der Argumente identisch sind, wenn der Abzug ausgeführt werden soll, während < die üblichen arithmetischen Konvertierungen (§5.9 / 2) voraussetzt Stellen Sie sicher, dass die Typen in einen "gemeinsamen Nenner" konvertiert werden. Beachten Sie, wie §13.6 / 12 eingebaute Operatoren als Kandidaten aufführt:

  

Für jedes Paar der beworbenen arithmetischen Typen L und R existiert ein Paar   Kandidatenoperatorfunktionen des Formulars

%Vor%      

wobei LR das Ergebnis der üblichen arithmetischen Konvertierungen zwischen ist   Typen L und R .

Eigentlich sollte std::min in der Lage sein, mit verschiedenen Typen umzugehen. Das Folgende ist ein modernerer Ansatz:

%Vor%

Demo .

    
Columbo 11.08.2015 08:42
quelle
2

Dies liegt daran, dass std::min eine Vorlagenfunktion ist.

%Vor%

Die Argumente müssen denselben Typ haben, aber wenn Sie (a<b) verwenden, könnte a implizit in ein long long

konvertiert werden     
Maximilian Ast 11.08.2015 08:17
quelle
-1

Der Operator < ist binär, also könnte der Compiler Argumente in denselben Typ konvertieren und vergleichen.

Andernfalls sollte min function etwas zurückgeben. Wie könnte der Compiler raten, welchen Typ er zurückgeben soll?

    
Heavy 11.08.2015 08:19
quelle
-1

Primitive Typen überladen Operatoren nicht, daher werden übliche arithmetische Konvertierungen angewendet und Ihr int wird in ein langes long konvertiert, und das "& lt;" hat eine gültige Bedeutung.

Sie können Operatoren nicht einmal für primitive Typen überladen: Ссылка

Beispiel, um zu zeigen, dass Ihr int zu long long hochgestuft wurde

%Vor%

Dokumentation Ссылка

  

Für die binären Operatoren (außer Verschiebungen), wenn die umgesetzten Operanden   haben verschiedene Arten, zusätzliche Reihe von impliziten Konvertierungen ist   angewendet, bekannt als übliche arithmetische Konvertierungen mit dem Ziel,   erzeuge den allgemeinen Typ (auch über den Typ std :: common_type zugänglich)   Merkmal)

    
dau_sama 11.08.2015 08:17
quelle

Tags und Links