Подтвердить что ты не робот

Почему в clang не работают литералы с комплексным числом?

Когда я запускаю этот код на ideone.com, он печатает (2,3):

#include <iostream>
#include <complex>

int main() {
    std::complex<double> val = 2 + 3i;
    std::cout << val << std::endl;
    return 0;
}

Но когда я использую clang на macOS 10.11.6, я не получаю никаких ошибок или предупреждений, но вывод (2,0):

$ clang --version
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0

$ clang -lc++ test.cpp && ./a.out
(2,0)

Что случилось с мнимой частью? Я что-то делаю неправильно?

4b9b3361

Ответ 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.