Ich habe einige Beispielcode, der sich unter Visual C++ 2012 mit den neuen C++ 11-Header anders verhält als unter VC++ 2010 Es handelt sich darum, was passiert, wenn Sie die std :: fmod-Funktion aufrufen, die Sie erhalten, wenn Sie cmath einschließen, und wenn die übergebenen Argumente nicht doubles sind, sondern Klassen sind, die eine implizite Konvertierung zum doppelten Operator haben:Unterschiedliches Verhalten von fmod (und andere) unter C++ 11, in Visual Studio mindestens
#include <cmath>
class Num {
double d_;
public:
Num(double d) : d_(d) {}
operator double() const { return d_; }
};
int main(int argc, char* argv[]) {
Num n1(3.14159265358979323846264338327950288419716939937510);
Num n2(2.0);
double result1 = fmod((double)n1, (double)n2);
double result2 = fmod((float)n1, (float)n2);
double result3 = fmod(n1, n2);
if (result2==result1) std::cout << "fmod(double, double) returns the same as fmod(float,float)" << std::endl;
if (result3==result1) std::cout << "fmod(Num, Num) returns the same as fmod(double,double)" << std::endl;
if (result3==result2) std::cout << "fmod(Num, Num) returns the same as fmod(float,float)" << std::endl;
}
Eher zu meiner Überraschung nennt dies die Version von Fmod, die zwei Floats statt der Version von fmod, die zwei Doppel nimmt.
Also meine Frage ist, ist dies das richtige Verhalten angesichts der C++ 11 Standard? Die einzige Information, die ich über das Verhalten finden kann, ist in der Dokumentation cppreference.com here, die sagt (Hervorhebung von mir):
Wenn ein Argument Integral-Typen hat, wird sie werfen zu verdoppeln. Wenn ein anderes Argument doppelt lang ist, ist der Rückgabetyp lang doppelt, andernfalls ist es doppelt.
Allerdings scheint die Implementierung in den Visual Studio-Header-Dateien zu implementieren "andernfalls ist es ein Float".
Jeder weiß, was die Absicht ist :-)?
Nachdem ich das Beispiel über eine Online-Version von C++ 11 von GCC ausgeführt habe (ich habe sonst keinen einfachen Zugriff auf eine aktuelle Kopie von GCC), würde es anscheinend die "doppelte" Version von fmod aufrufen was ich naiv erwarte.
Aus Gründen der Klarheit, ich bin mit
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.51106.1 für x86
das, was mit
Microsoft Visual kommt, ist Studio Express 2012 für Windows Desktop Version 11.0.51106.01 Update 1
Wie haben Sie feststellen, dass es die 'float' Version nennen? – NPE
Ich habe einen Debugger durchlaufen. Ich habe kein Beispiel, das die eine oder andere Art beweist, was man tut, und wird aktualisiert. –
Großartig. Ich denke, es wäre wirklich hilfreich, einen SSCCE (http://sscce.org/) zu sehen und auch vollständige Details Ihrer Compiler-Version zu haben. – NPE