Menandai fungsi constexprjuga menjadikannya fungsi inline § [dcl.constexpr] / 1:
Fungsi atau anggota data statis yang dideklarasikan dengan specifier constexpr secara implisit merupakan fungsi atau variabel inline (7.1.6).
inline, pada gilirannya, berarti Anda perlu memasukkan definisi fungsi itu di setiap unit terjemahan yang dapat digunakan. Itu pada dasarnya berarti constexprfungsi harus berupa:
- terbatas untuk digunakan dalam satu unit terjemahan, atau
- didefinisikan dalam tajuk.
Sebagian besar fungsi khas yang ingin Anda deklarasikan di header dan tentukan dalam file sumber (dan apa pun yang menggunakannya hanya menyertakan header, lalu tautan ke file objek sumber itu) constexprtidak akan berfungsi.
Secara teori, saya kira Anda bisa memindahkan semuanya ke header dan hanya memiliki satu file sumber yang hanya mencakup semua header, tetapi ini akan merusak waktu kompilasi secara drastis, dan untuk sebagian besar proyek yang serius akan membutuhkan sejumlah besar memori untuk dikompilasi.
Suatu constexprfungsi juga dibatasi dalam beberapa hal, jadi untuk beberapa fungsi mungkin tidak menjadi pilihan sama sekali. Pembatasan meliputi:
- fungsi virtual tidak bisa
constexpr.
- tipe kembalinya harus berupa 'tipe literal "(mis., tidak ada objek dengan ctor atau dtor non-trival).
- semua parameternya harus tipe literal.
- tubuh fungsi tidak dapat berisi
tryblok.
- itu tidak dapat berisi definisi variabel dari tipe non-literal, atau apa pun dengan durasi penyimpanan statis atau thread.
Saya telah melewatkan beberapa hal yang agak tidak jelas (mis., Itu juga tidak dapat memuat a gotoasm pernyataan atau ), tetapi Anda mendapatkan ide - untuk beberapa hal, itu tidak akan berhasil.
Intinya: ya, ada beberapa situasi di mana ini akan menjadi ide yang buruk.