C++中可以參與編譯期計算的主要是類型和編譯期常量,它們都是不可變的(immutable)。從這個角度來說,C++模板元編程是一種純函數式語言,遵循引用透明性。也就是說函數沒有狀態,具有不可變性。對一個函數任何時候輸入相同的入參,它將永遠返回相同的值。另外,這里也沒有真正的變量。模板元編程里所謂變量只是一個類型的別名符號,第一次綁定后就不能再變。如果想要保存一個變化后的值,只能重新定義一個新的變量。
例如下面代碼就無法編譯通過:
using Sum = __int(0); // ok
Sum = __add(Sum, __int(6)); // error
只能像下面這樣:
using Int0 = __int(0); // ok
using Sum = __add(Int0, __int(6)); // ok
這種不可變性帶來很多好處。例如由于函數沒有狀態,所以可以保存入參然后延遲計算,這使得語言層面的惰性計算變得容易。
但這種不可變性也帶來很多問題,它會占用更多的內存和運行時開銷。純函數式語言一般依賴編譯器或者解釋器對其進行優化,但是性能普遍還是沒有命令式的好。這也是為什么大量地使用模板會使得C++的編譯速度超出尋常地慢,而且會占用更多的內存。