Chciałem obliczyć wartość e
w czasie kompilacji (nie martw się, nie zadanie domowe), ale coś poszło nie tak.Możliwe szablonu i constexpr-if niekompatybilność
template<size_t limit = 3, class result = std::ratio<0, 1>, size_t factorial = 1, size_t count = 1>
constexpr double e_impl() {
if constexpr(limit == 0) {
return static_cast<double>(result{}.num)/result{}.den;
}
return e_impl<limit - 1, std::ratio_add<result, std::ratio<1, factorial>>, factorial * count, count + 1>();
}
Podczas obliczania wartości są prawidłowe, kompilator zgłasza błąd dotyczący przepełnienia w szablonie. Wygląda na to, że zmienna limit
jest poza zakresem (poniżej 0
), ale nie powinno się tak stać, ponieważ obudowa 0
jest obsługiwana przez instrukcję if constexpr(…)
.
Pytanie brzmi: czy się mylę i należy się spodziewać takiego zachowania, czy jest to błąd kompilatora? Skompilowany z GCC 7.1.0.
Dlaczego ta odpowiedź byłaby bardziej przydatna? –
@ CrazyEddie Nouning przysłówki. Jak ekspresyjnie. – Yakk