Sử dụng gcc 4.9
tôi thấy rằng loại được tạo ra với loại đen cho số phức là không giống như khi tạo ra bởi phương tiện thông thường, ví dụ:typeid (phức tạp <double> (0.0,1.0)) = typeid (1.0i)
typeid(complex<double>(0.0,1.0)) != typeid(1.0i)
- Tôi có nhầm lẫn ở đây không?
- Đây có phải là lỗi trình biên dịch hoặc hành vi tiêu chuẩn dự định không?
- Nếu hành vi tiêu chuẩn dự định: Lý do cơ bản đằng sau là gì?
Thêm MCVE thiếu
#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 hướng dẫn:
g++ -std=gnu++14 complex.cpp -o complex.exe
Output:
types are unexpectedly not the same
1
(-1,0)
Điều thú vị là các literal không thậm chí dường như là một số ảo thích hợp. (Tôi chắc chắn tôi nhìn ra một cái gì đó ...)
Bất kỳ cơ hội nào bạn có thể đặt trong danh sách nguồn thực sự biên dịch? Tôi nghĩ * bạn đang sử dụng 'std :: complex', khác với '_Complex', phần mở rộng gnu cho các hằng số tưởng tượng, nhưng không có MCVE câu nói khó * những gì bạn đang thực sự làm. –
WhozCraig
Cảm ơn bạn đã cập nhật. có, chúng là các loại khác nhau. Một lần là từ thư viện chuẩn, cái kia từ phần mở rộng của trình biên dịch. – WhozCraig
[Không thể tạo lại vấn đề trong C++ 14] (http://coliru.stacked-crooked.com/a/1fbd46340ab9b14e) @WhozCraig 'i' là (cũng?) Một hậu tố bằng chữ trong C++ 14. Trong chế độ C++ 11, gcc có thể sử dụng [phần mở rộng này] (https://gcc.gnu.org/onlinedocs/gcc/Complex.html) – dyp