2016-02-29 21 views
8

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?

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