gcc 4.9
kullanılarak geleneksel araçlarla oluşturulan olduğu gibi karmaşık sayılar için hazır bilgisinin oluşturulacak türleri, örneğin, aynı olmadığını tespit:typeid (karmaşık <double> (0.0,1.0)) = typeid (1.0i)
typeid(complex<double>(0.0,1.0)) != typeid(1.0i)
- Burada hata mı yapıyorum?
- Bu bir derleyici hatası mı yoksa amaçlanan standart davranış mı?
- Amaçlanan standart davranış: Arkadaki mantık nedir? Eksik MCVE
#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; }
Derleme talimatları ekleme
:
g++ -std=gnu++14 complex.cpp -o complex.exe
Çıktı:
types are unexpectedly not the same
1
(-1,0)
İlginç değişmez bile uygun bir hayali sayı görünmüyor. (Ben bir şey bakan ediyorum eminim ...) Programın
Bunu gerçekten derleyen bir kaynak listesine yerleştirme şansınız var mı? Ben * düşünüyorum * std :: karmaşık ', '_Complex', sanal sabitler için gnu uzantısı, ama bir MCVE'siz onun zor söyleyerek * nedir * aslında * yapıyorsun. –
WhozCraig
Güncelleme için teşekkürler. evet, farklı tipler. Bir zamanlar standart kütüphaneden, diğeri derleyici uzantısından. – WhozCraig
[Sorunu C++ 14'te yeniden üretemiyorum] (http://coliru.stacked-crooked.com/a/1fbd46340ab9b14e) @WhozCraig 'i' (aynı zamanda?) C++ 14'teki bir son ekidir. C++ 11 modunda, gcc muhtemelen [bu uzantı] kullanır (https://gcc.gnu.org/onlinedocs/gcc/Complex.html) – dyp