Menandai fungsi constexpr
juga 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 constexpr
fungsi 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) constexpr
tidak 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 constexpr
fungsi 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
try
blok.
- 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 goto
asm
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.