gcc 4.9
Verwendung fand ich, dass mit Typ-generierten Typen wörtlichen für komplexe Zahlen sind nicht das gleiche wie wenn sie durch herkömmliche Mittel geschaffen, das heißt:typeid (komplexe <double> (0.0,1.0)) = typeid (1.0i)
typeid(complex<double>(0.0,1.0)) != typeid(1.0i)
- Mache ich hier einen Fehler?
- Ist dies ein Compilerfehler oder beabsichtigtes Standardverhalten?
- Wenn beabsichtigtes Standardverhalten: Was ist der Grund dafür?
die fehlenden MCVE Hinzufügen
#include <complex>
using std::complex;
using namespace std::literals::complex_literals;
#include <iostream>
using std::cout;
using std::endl;
#include <typeinfo>
int main(int argc, char* argv[]) {
if (typeid(complex<double>(0.0, 1.0)) == typeid(1.0i))
cout << "types are same as expected" << endl;
else
cout << "types are unexpectedly not the same" << endl;
cout << 1.0i*1.0i << endl;
cout << complex<double>(0.0, 1.0)*complex<double>(0.0, 1.0) << endl;
}
Compile Anweisungen:
g++ -std=gnu++14 complex.cpp -o complex.exe
Ausgang:
types are unexpectedly not the same
1
(-1,0)
Interessanterweise ist die wörtliche scheint nicht einmal eine richtige imaginäre Zahl zu sein. (Ich bin sicher, ich bin etwas mit Blick auf ...)
Gibt es eine Chance, dass Sie das in eine Quellliste, die tatsächlich kompiliert? Ich denke * du verwendest 'std :: complex', was anders ist als '_Complex', die gnu-Erweiterung für imaginäre Konstanten, aber ohne MCVE ist es schwer zu sagen * was * du eigentlich machst. –
WhozCraig
Danke für das Update. Ja, sie sind verschiedene Arten. Once stammt aus der Standardbibliothek, der andere aus einer Compiler-Erweiterung. – WhozCraig
[Das Problem kann nicht in C++ reproduziert werden 14] (http://coliru.stacked-crooked.com/a/1fbd46340ab9b14e) @WhozCraig Das 'i' ist (auch?) Ein literales Suffix in C++ 14. Im C++ 11-Modus verwendet gcc wahrscheinlich [diese Erweiterung] (https://gcc.gnu.org/onlinedocs/gcc/Complex.html) – dyp