ฉันกำลังพยายามคำนวณความยาวของสตริงลิเทอรัลในเวลาคอมไพล์ ในการทำเช่นนั้นฉันใช้รหัสต่อไปนี้:
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 + length(str + 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
ทุกอย่างทำงานตามที่คาดไว้โปรแกรมจะพิมพ์ 4 และ 8 รหัสแอสเซมบลีที่สร้างขึ้นโดยเสียงดังแสดงว่าผลลัพธ์ถูกคำนวณในเวลาคอมไพล์:
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
คำถามของฉัน: มีการรับประกันตามมาตรฐานหรือไม่ว่าlength
ฟังก์ชันจะได้รับการประเมินเวลาคอมไพล์
หากนี่เป็นความจริงประตูสำหรับการคอมไพล์การคำนวณตัวอักษรสตริงเวลาเพิ่งเปิดให้ฉัน ... ตัวอย่างเช่นฉันสามารถคำนวณแฮชในเวลาคอมไพล์และอื่น ๆ อีกมากมาย ...