Да, большинство typedefs содержат имя псевдонима и базовый тип, но нет требование, чтобы тип был единственным токеном:
typedef unsigned long long int ULLI;
// \____________________/
// Many tokens for underlying type
Так что все, с чем работает ваш код, появляется иметь уже тип double complex
.
Этот тип фактически часть стандарта C, содержится в <complex.h>
, но эквивалентный заголовок C ++ <ccomplex>/<complex.h>
теперь заменен с <complex>
, больше подходящим для C ++, поэтому было бы правильнее включить его и использовать тип complex<double>
.
Я считаю, что с C ++ 17 <ccomplex>/<complex.h>
перестал хранить любое наследие C и только что начали включать другие не унаследованные заголовки из стандартной библиотеки C ++.
А потом, в C ++ 20, они вообще отказались от него. От (слегка перефразировано) C++20 [diff.cpp17.library]
, который детализирует различия:
Изменение: удаление пустых заголовочных файлов C ++.
Обоснование: пустые заголовки подразумевают ложное требование для достижения C совместимость с заголовками C ++.
Эффект на исходную функцию: допустимая программа C ++ 2017, которая выполняет #include
из <ccomplex>
(среди прочих), может не скомпилироваться. Чтобы сохранить то же поведение, #include
из <ccomplex>
можно заменить на #include
из <complex>
.