chỉ sử dụng tiêu chuẩn C++ 11:
namespace g{ int x; }
constexpr int foo()
{
//return g::x = 42; Nah, not constant
return 42; // OK
}
int main()
{}
đây là một ví dụ:
constexpr int foo(int blah = 0)
{
return blah + 42; // OK
}
int main(int argc, char**)
{
int bah[foo(2)]; // Very constant.
int const troll = foo(argc); // Very non-constant.
}
Ý nghĩa của GCC của __attribute__(const)
được diễn tả trong GNU compiler docs như & hellip;
Nhiều chức năng không kiểm tra bất kỳ giá trị nào ngoại trừ đối số của chúng và không có hiệu ứng ngoại trừ giá trị trả lại. Về cơ bản, đây chỉ là lớp nghiêm ngặt hơn một chút so với thuộc tính pure
bên dưới, vì chức năng không được phép đọc bộ nhớ toàn cầu.
Có thể thực hiện điều đó có nghĩa là kết quả hàm chỉ nên phụ thuộc vào đối số và hàm sẽ không có tác dụng phụ.
Điều này cho phép một lớp tổng quát hơn các chức năng hơn 11 C++ constexpr
, mà làm cho chức năng inline
, hạn chế tranh cãi và kết quả chức năng để loại đen, và hạn chế những điều khoản về "hoạt động" của cơ quan chức năng để một đơn Tuyên bố return
, trong đó (C++ 11 §7.1.5/3)
- mọi lần gọi hàm tạo và chuyển đổi ngầm được sử dụng để khởi tạo giá trị trả về (6.6.3, 8.5) sẽ là một trong những điều khoản được cho phép biểu thức liên tục (5.19)
Ví dụ, rất khó (tôi nghĩ không phải là không thể, nhưng khó) để thực hiện một hàm constexpr
sin
.
Nhưng sự tinh khiết của các vấn đề kết quả duy nhất để hai bên:
Khi biết đến là tinh khiết, trình biên dịch có thể bõ mẫu âm chót cuộc gọi với kết quả được biết đến.
Đây chủ yếu là tối ưu hóa mã do macro tạo. Thay thế macro bằng các hàm inline
để tránh tạo ra các biểu thức con giống hệt nhau.
Khi được biết là tinh khiết, một lập trình viên có thể xóa hoàn toàn cuộc gọi.
Đây chỉ là vấn đề về tài liệu thích hợp. :-)
Vì vậy, thay vì tìm cách thể hiện độ tinh khiết của ví dụ: sin
trong ngôn ngữ, tôi khuyên bạn chỉ nên tránh tạo mã thông qua các macro và ghi lại các hàm thuần túy như vậy.
Và sử dụng constexpr
cho các chức năng mà tại đó thực tế có thể (không may, tính đến tháng 12 năm 2012 trình biên dịch Visual C++ mới nhất chưa hỗ trợ constexpr
).
Có câu hỏi SO trước về the relationship between pure and constexpr
. Chủ yếu, mỗi hàm constexpr
là thuần túy, nhưng không phải ngược lại.
cũng không chắc chắn ý bạn là gì, nhưng bạn đã thử 'constexpr' –
KHÔNG PHẢI LÀ. Ý tôi là tinh khiết không liên tục. Các thuộc tính của GCC có chút ít gây nhầm lẫn. – Cartesius00
Tôi nghĩ bạn cần phải thuật lại câu hỏi của bạn, bởi vì bạn có thuộc tính đúng. Rằng nó không tạo ra cảnh báo bạn muốn là một vấn đề khác - ít nhất là khi lấy câu hỏi của bạn theo giá trị khuôn mặt. –