Ответ 1
Я считаю, что для этого первого примера компилятор использует расширение GNU:
-fext-numeric-literals (C++ and Objective-C++ only)
Принять воображаемый, фиксированный или машинный литеральный номер суффиксы как расширения GNU. Когда эта опция отключена, эти суффиксы рассматриваются как С++ 11 определяемые пользователем буквенные числовые суффиксы. Это включено по умолчанию для всех диалектов pre-С++ 11 и всех диалектов GNU: -std = С++ 98, -std = gnu ++ 98, -std = gnu ++ 11, -std = gnu ++ 14. Эта опция отключена по умолчанию для ISO С++ 11 (-std = С++ 11,...).
Когда я запускаю его с clang, я получаю (вы используете -Wall -pedantic
?:)):
предупреждение: мнимые константы - это расширение GNU [-Wgnu-мнимого постоянной]
В любом случае, ваш код не является стандартным. Чтобы использовать С++ 14 литералов, сделайте код:
#include <iostream>
#include <complex>
using namespace std::complex_literals;
int main() {
std::complex<double> val = 2.0 + 3i;
std::cout << val << std::endl;
return 0;
}
Из документации:
Эти операторы объявляются в пространстве имен std:: literals:: complex_literals, где как литералы, так и complex_literals - это встроенные пространства имен. Доступ к этим операторам может получить с использованием пространства имен std:: litals, используя пространство имен std:: complex_literals и использование пространства имен станд:: литералы:: complex_literals.