Ответ 1
Поведение программы зависит от стандартного режима языка gcc:
Существует расширение gcc для встроенного литерального суффикса i
, который создает комплексные числа C99. Это разные встроенные типы, такие как _Complex double
, в отличие от "определяемого пользователем" класса (специализация шаблона) std::complex<double>
, используемого в С++.
В С++ 14, С++ теперь имеет определяемый пользователем буквенный суффикс i
для сложных чисел. То есть, функция complex<double> operator"" i(long double)
внутри встроенного пространства имен std::literals::complex_literals
.
Эти два буквальных суффикса конкурируют:
-
В режиме С++ 11 возможно только встроенное расширение, но это расширение. Следовательно, gcc разрешает его только в режиме
-std=gnu++11
и даже предупреждает об этом. Как ни странно, clang позволяет даже в режиме-std=c++11
. -
В строгом режиме С++ 14 (
-std=c++14
или-std=c++1y
) встроенное расширение необходимо отключить, чтобы устранить неоднозначность (насколько я могу судить), следовательно, gcc и clang выбирают определяемый пользователем буквенный суффикс. -
В режиме gnu-extension-С++ 14
-std=gnu++14
gcc выбирает встроенный суффикс (для обратной совместимости?), тогда как clang выбирает определяемый пользователем суффикс. Это выглядит странно, и я предлагаю искать или регистрировать отчеты об ошибках здесь.
В зависимости от того, какой буквенный суффикс выбран, вы либо получаете встроенный тип _Complex double
, либо некоторый std::complex<double>
.