gcc
компилирует следующий код без предупреждения:
#include <cmath>
struct foo {
static constexpr double a = std::cos(3.);
static constexpr double c = std::exp(3.);
static constexpr double d = std::log(3.);
static constexpr double e1 = std::asin(1.);
static constexpr double h = std::sqrt(.1);
static constexpr double p = std::pow(1.3,-0.75);
};
int main()
{
}
Ни одна из стандартных функций библиотеки, используемых выше, не является функцией constexpr, нам разрешено использовать их там, где требуется постоянное выражение из проекта стандарта С++ 11 и черновик стандарта С++ 14 7.1.5
[dcl.constexpr]:
[...] Если он инициализирован вызовом конструктора, этот вызов должен быть постоянное выражение (5.19). В противном случае, или если спецификатор constexpr используется в описании ссылки, каждое полное выражение, которое появляется в его инициализатор должен быть постоянным выражением. [...]
Даже при использовании -std=c++14 -pedantic
или -std=c++11 -pedantic
никаких предупреждений не генерируется (см. его в прямом эфире). Использование -fno-builtin
приводит к ошибкам (см. Его в прямом эфире), что указывает на то, что builtin версия этих стандартов библиотечные функции обрабатываются так, как если бы они были constexpr
Пока clang
не позволяет использовать код с любой комбинацией флагов, которые я пробовал.
Итак, это расширение gcc
для обработки хотя бы некоторых встроенных функций, как если бы они были функциями constexpr, даже если стандарт явно не требует их. Я ожидал бы, по крайней мере, получить предупреждение в режиме строгого соответствия, является ли это соответствующим расширением?