Jak rozumiem, constexpr
nie jest kompletnym Turingiem w przeciwieństwie do metaprogramowania szablonu, więc uważam, że to nie to samo. Tak więc pytanie brzmi, w jakim stopniu constexpr
powoduje, że metaprogramowanie szablonów staje się przestarzałe?C++ 11 constexpr do przestarzałych meta-programowania szablonów?
Odpowiedz
constexpr
jest absolutnie Turing-complete. Rekursja jest dozwolona. Jest to wygodny sposób definiowania funkcji działających w czasie kompilacji oraz w czasie wykonywania. Funkcje constexpr
, będąc jedynie funkcjami, nie mogą wykonywać operacji na typach. (O ile nie używasz metaprogramowania szablonu do zdefiniowania tej funkcji, oczywiście.)
Oba szablony klas i constexpr
mogą być używane do przechowywania wyrażeń stałych w czasie kompilacji, ale tam kończy się podobieństwo. Nie są one zbędne, a TMP w najbliższym czasie nie zniknie.
Niektóre szczególnie brzydkie obliczenia kompilacji mogą być bardziej elegancko przepisane jako odpowiednie funkcje.
+1 dla obserwacji, że 'constexpr' nie może działać na typach. –
Dzięki za wyjaśnienie tego tak dobrze ... – polapts
'constexpr' jest Turing complete (oczywiście ignorując wymagania nieskończoności). –
@ R.MartinhoFernandes: Jeśli 'constexpr' jest Turing kompletny, użyj tylko' constexpr' do modelowania listy liczb całkowitych dopuszczalnych na obu końcach. – kennytm
@ R.MartinhoFernandes: Możesz być ciekawy w zamieszczaniu odpowiedzi na http://stackoverflow.com/questions/9201506/is-constexpr-based-computation-turing-complete. – kennytm