Ошибка компиляции Constexpr с использованием std::acos с clang++, а не с g++

Я хочу поэкспериментировать с переносом проекта с gcc на clang++. Я признаю невежество с моей стороны, я не уверен, почему следующий фрагмент кода

template <typename T>
constexpr T pi{std::acos(T(-1.0))};

молча компилируется с помощью g++, но clang++ выдает ошибку

trig.hpp:3:13: error: constexpr variable 'pi<float>' must be initialized by a constant expression
constexpr T pi{std::acos(T(-1.0))};

и я надеялся, что кто-то, кто знает об этом больше, чем я, может просветить меня.

NB: Пробовал с -std=C++14 и C++1y. Сбой в clang версии 3.6.2 (теги/RELEASE_362/final). Работает с g++ (GCC) 5.2.0.


person Timtro    schedule 28.09.2015    source источник
comment
@ShafikYaghmour Я думал, что хорошо искал. Я ошибался. Спасибо. Это действительно неутешительный результат. Я также удивлен, что GCC, по крайней мере, не выдает предупреждение, когда собирается разрешить что-то запрещенное стандартом. Я тоже компилировал с -pedantic! Если вы хотите написать ответ, я приму его.   -  person Timtro    schedule 28.09.2015
comment
Я не удивлен, что вопрос не возник, совпадение ключевых слов кажется минимальным. Когда я впервые столкнулся с этим около года назад, я ничего не мог найти, и так было до тех пор, пока я случайно не наткнулся на выпуск языковой рабочей группы 2013 года, когда мне удалось собрать кусочки вместе.   -  person Shafik Yaghmour    schedule 28.09.2015


Ответы (1)


Clang здесь прав, нам не разрешено использовать acos в постоянном выражении.

Проблема в том, что acos не помечен как constexpr в стандарте, но gcc рассматривает некоторые функции, не отмеченные в стандарте, включая acos, как constexpr. Это несоответствующее расширение, которое в конечном итоге должно быть исправлено в gcc.

Встроенные функции часто используются для постоянного сворачивания, и мы можем видеть, используйте -fno-builtin с gcc, это отключит это несоответствующее поведение, и мы получим следующую ошибку:

error: call to non-constexpr function 'double acos(double)'
constexpr T pi{std::acos(T(-1.0))};
                         ^
person Shafik Yaghmour    schedule 28.09.2015