Khi tôi xác định hàm constexpr
, tôi có nên khai báo nó là noexcept
không? Tôi tưởng tượng trong trường hợp các đối số và cách sử dụng thỏa mãn các yêu cầu đối với việc đánh giá thời gian biên dịch, ý nghĩa của các ngoại lệ tiềm năng là tranh luận. Nhưng nó sẽ áp dụng như bình thường đối với các trường hợp khi hàm được đánh giá tại thời gian chạy. Như một vấn đề quan tâm thực tế, nếu chức năng thực sự là đơn giản, có thể sử dụng số học tích hợp hoặc một diễn viên, như vậy tôi mong đợi trình biên dịch luôn luôn có thể nội tuyến chức năng và tối ưu hóa trên nó, không quan trọng hiệu quả của mã được tạo ra nếu tôi rời khỏi noexcept
?Các hàm `constexpr` có phải là` noexcept` không?
8
A
Trả lời
7
Không, bạn không nên.
"Không thể thất bại" và "có thể được đánh giá tại thời gian biên dịch" là các vấn đề trực giao. Ví dụ, bạn muốn viết một hàm số nguyên, nhưng bạn muốn lấy sức mạnh như đã ký (vì bạn tin rằng các số không dấu chỉ nên được sử dụng cho các trường hợp rất đặc biệt). Bây giờ bạn nói rằng bạn muốn ném một ngoại lệ nếu sức mạnh là tiêu cực. Trong C++ 14 bạn có thể viết nó như sau:
constexpr int ipow(int base, int power) {
if (power < 0) throw std::domain_error("negative power");
int result = 1;
for (int i = 0; i < power; ++i) result *= base;
return result;
}
Chức năng này rõ ràng không phải là ngoại lệ, nhưng đối với các đối số không âm, bạn rõ ràng có thể đánh giá nó tại thời gian biên dịch. Nếu bạn thử nó cho các đối số phủ định trong một ngữ cảnh mà bạn cần kết quả tại thời gian biên dịch, bạn sẽ nhận được một lỗi biên dịch, điều đó sẽ ổn.
Các vấn đề liên quan
- 1. Đây có phải là phần mở rộng trình biên dịch phù hợp để xử lý các hàm thư viện chuẩn không phải là constexpr như constexpr không?
- 2. Nhà xây dựng/chuyển nhượng mặc định có bị làm phiền bởi noexcept hoặc constexpr không?
- 3. hàm constexpr phải có một giá trị đối số?
- 4. Có phải constexpr được hỗ trợ với các hàm/biểu thức lambda không?
- 5. Cách khác để xác nhận các hàm constexpr
- 6. Liệu constexpr ngụ ý không nhận diện?
- 7. Có phải số_lần tối thiểu/max constexpr không?
- 8. Tại sao constexpr phải là tĩnh?
- 9. Tại sao không phải là tiêu chuẩn :: iota constexpr?
- 10. Constexpr decltype
- 11. toDataURL không phải là hàm
- 12. Recursive noexcept đặc điểm kỹ thuật
- 13. db.createCollection không phải là hàm
- 14. c.apply không phải là hàm
- 15. Khi nào thì thiết lập hàm khởi tạo là constexpr?
- 16. Hàm constexpr ảo hoàn toàn
- 17. Tại sao yêu cầu constexpr mặc dù hàm thành viên là constexpr?
- 18. Tại sao constexpr không phải là mặc định cho tất cả các chức năng?
- 19. ReactJS: React.render không phải là một hàm và React.createElement không phải là hàm
- 20. TypeError: $ (...). Typeahead không phải là hàm có RequireJS
- 21. MySQL Short Circuit có phải là hàm IF() không?
- 22. Angularjs Argument không phải là một hàm có chuỗi
- 23. Có một constructor constexpr di chuyển không?
- 24. Sao chép mảng trong hàm tạo constexpr
- 25. LoạiError: $ (...) DataTable không phải là hàm
- 26. Có phải% $ var dereferencing là một hàm băm Perl không?
- 27. Đây có phải là hàm chuỗi Fibonacci đệ quy không?
- 28. TypeError: a.apply không phải là hàm
- 29. jQuery .sortable không phải là hàm
- 30. TypeError: $ .fn.dataTable.moment không phải là hàm