dieses Stück Code vor:Hinzufügen von Doppel- und komplexen Zahlen in C++
#include <iostream>
#include <complex>
int main()
{
std::complex<double> z1 = 5;
std::cout << z1 - 1 << "\n"; // must change to z1 - 1.0 to compile
std::complex<int> z2 = 5;
std::cout << z2 - 1.0 << "\n"; // must change to z2 - 1 to compile
}
Dies erzeugt einen Übersetzungsfehler, da keine operator-
für die Typen in der Ausdrücken z1 - 1
oder z2 - 1.0
gefunden wird. Auf der anderen Seite funktioniert es gut, diese Ausdrücke so zu ändern, dass die Basistypen übereinstimmen.
Naiv für z1 - 1
würde ich die int
1 erwarten zu einem double
gefördert werden, und erwartete, dass die z2
, mit dem Basistyp int
, in z2 - 1.0
zu einem complex<double>
gefördert werden. Was ist los?
Normalerweise verwende ich 'std :: identity :: type', um die Deduktion für nachfolgende Parameter zu unterdrücken, ich finde, dass es viel besser für Fälle sehr ähnlich wie dieser funktioniert. Ich frage mich, warum sie das nicht im Standard gemacht haben? Vielleicht würden sie es als einen Defekt betrachten, aber es könnte einen tieferen Grund geben, warum sie es nicht so gemacht haben. –
VoidStar
@VoidStar Nicht sicher, was die Geschichte ist, aber "komplex" gibt es schon seit C++ 98, also könnte es einfach sein, dass damals noch niemand daran gedacht hat. Interessanterweise gibt es eine [Converting Constructor Template] (http://en.cppreference.com/w/cpp/numeric/complex/complex) Definition, also würden Sie denken, dass 'operator-' mit 2 definiert wäre verschiedene Template-Parameter auch. – Praetorian