Nó đơn giản hóa việc triển khai, như Andy Prowl nói. Điều đó có thể trả lời "Tại sao", nhưng nó không nói nó như thế nào.
Một hàm chỉ có giá trị trả lại và cụ thể hơn là không có biến cục bộ, là tình huống đặc biệt cho trình biên dịch. Hàm này bây giờ bao gồm một biểu thức duy nhất: AST của hàm chỉ cần có một gốc đơn. Việc thiếu các biến có nghĩa là biểu thức này có thể được đánh giá mà không có một máy ảo toàn diện để xử lý nó, thay vào đó một bộ đánh giá biểu thức cây đơn giản có thể được sử dụng. Vì nhiều lý do, trình biên dịch có thể đã có một bộ đánh giá như vậy, hoặc có thể tạo một trình đánh giá tương đối dễ dàng (nó trở thành một sự đơn giản hóa cây).
Chỉ biết rằng constexpr
được sử dụng bên trong biểu thức cũng cung cấp một sự đơn giản hóa quan trọng. Điều này đảm bảo rằng mỗi đỉnh trong hàm AST có cùng thuộc tính, ngay cả khi nó là một cuộc gọi hàm. Toàn bộ cơ chế constexpr
sau đó là một hình thức tổng quát của const-gấp. Và mặc dù nó không phải luôn luôn được thực hiện ở mức cao này trong trình biên dịch, nó đảm bảo nó có thể được thực hiện mà không có một nỗ lực rất lớn (so với một máy ảo đầy đủ).
Quay lại câu hỏi "tại sao". Hạn chế này chủ yếu là do giới hạn tài nguyên trên các nhà cung cấp. Tính năng này, như được chỉ định, không phải là một nỗ lực rất lớn và do đó các nhà cung cấp thực sự có thể thực hiện nó trong một khoảng thời gian hợp lý. Nếu không có những hạn chế như vậy, đặc biệt cho phép các biến cục bộ, nó làm tăng đáng kể lượng công việc cần thiết. Từ quan điểm của người dùng (chúng tôi, các lập trình viên), các hạn chế là hoàn toàn tùy ý.
Nguồn
2013-06-09 03:57:46
Tôi nghi ngờ đó chỉ là phương tiện để đơn giản hóa việc triển khai trình biên dịch. – juanchopanza
Vì tiêu chuẩn nói như vậy. Việc cho phép các hàm tổng quát hơn sẽ làm phức tạp cuộc sống của các trình biên dịch khá nhiều (dù sao, C++ 14 nâng một số hạn chế) –
Bởi vì cho phép các biến có nghĩa là thêm nhiều hạn chế khác (phức tạp hơn). Vì vậy, họ giữ nó đơn giản để giới thiệu của họ. Tuy nhiên, có nhiều cách xung quanh nó (gọi hàm 'constexpr' từ một hàm khác), ví dụ: – Dave