Tôi đang cố gắng tính độ dài của một chuỗi ký tự tại thời điểm biên dịch. Để làm như vậy, tôi đang sử dụng mã sau:
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 + length(str + 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
Mọi thứ hoạt động như mong đợi, chương trình in ra 4 và 8. Mã hợp ngữ được tạo bởi clang cho thấy rằng kết quả được tính toán tại thời điểm biên dịch:
0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d"
0x100000f65: movl $0x4, %esi
0x100000f6a: movl $0x8, %edx
0x100000f6f: xorl %eax, %eax
0x100000f71: callq 0x100000f7a ; symbol stub for: printf
Câu hỏi của tôi: nó có được đảm bảo bởi tiêu chuẩn rằng length
chức năng sẽ được đánh giá thời gian biên dịch không?
Nếu điều này là đúng, cánh cửa để biên dịch chuỗi thời gian tính toán theo chuỗi nghĩa đen vừa mở ra cho tôi ... ví dụ: tôi có thể tính toán hàm băm tại thời điểm biên dịch và nhiều hơn nữa ...