Đánh dấu một chức năng constexpr
cũng làm cho nó trở thành một hàm nội tuyến § [dcl.constexpr] / 1:
Hàm hoặc thành viên dữ liệu tĩnh được khai báo với bộ xác định constexpr hoàn toàn là hàm hoặc biến nội tuyến (7.1.6).
inline
lần lượt, có nghĩa là bạn cần bao gồm định nghĩa của hàm đó trong mọi đơn vị dịch mà nó có thể được sử dụng. Điều đó về cơ bản có nghĩa là các constexpr
chức năng phải là:
- bị hạn chế sử dụng trong một đơn vị dịch hoặc
- được định nghĩa trong một tiêu đề.
Hầu hết các hàm điển hình mà bạn muốn khai báo trong một tiêu đề và xác định trong một tệp nguồn (và bất kỳ thứ gì khác sử dụng chúng chỉ bao gồm tiêu đề, sau đó liên kết với tệp đối tượng của nguồn đó) constexpr
sẽ không hoạt động.
Về lý thuyết, tôi cho rằng bạn chỉ có thể chuyển mọi thứ vào các tiêu đề và chỉ có một tệp nguồn chỉ bao gồm tất cả các tiêu đề, nhưng điều này sẽ làm tổn thương thời gian biên dịch một cách quyết liệt và đối với hầu hết các dự án nghiêm túc sẽ cần rất nhiều bộ nhớ để biên dịch.
Một constexpr
chức năng cũng bị hạn chế theo một số cách, vì vậy đối với một số chức năng, nó có thể không phải là một tùy chọn. Các hạn chế bao gồm:
- chức năng ảo không thể
constexpr
.
- kiểu trả về của nó phải là "kiểu chữ" (ví dụ: không có đối tượng nào có bộ đệm hoặc bộ ba không phải là bộ ba).
- tất cả các tham số của nó phải là loại chữ.
- cơ thể chức năng không thể chứa một
try
khối.
- nó không thể chứa định nghĩa biến của loại không theo nghĩa đen hoặc bất cứ thứ gì có thời lượng lưu trữ tĩnh hoặc luồng.
Tôi đã bỏ qua một vài điều khá mơ hồ (ví dụ, nó cũng không thể chứa một goto
hoặc một asm
tuyên bố), nhưng bạn có ý tưởng - đối với một vài điều, nó sẽ không hoạt động.
Điểm mấu chốt: có, có khá nhiều tình huống mà đây sẽ là một ý tưởng tồi.