Tôi muốn tính giá trị e
tại thời gian biên dịch (đừng lo lắng, không phải bài tập về nhà), nhưng đã xảy ra sự cố.Mẫu có thể & constexpr – nếu không tương thích
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>();
}
Trong khi giá trị được tính là chính xác, trình biên dịch sẽ phát ra lỗi về tràn trong mẫu. Có vẻ như biến số limit
nằm ngoài phạm vi (bên dưới 0
), nhưng không nên xảy ra khi số 0
–case đang được xử lý theo tuyên bố if constexpr(…)
.
Vì vậy, câu hỏi là, tôi có sai và hành vi đó nên được dự kiến hay là lỗi trình biên dịch? Biên dịch với GCC 7.1.0.
Lý do tại sao câu trả lời này hữu ích hơn. –
@CrazyEddie Nouning adverbs. Làm thế nào rõ ràng. – Yakk