Jawaban singkatnya adalah bahwa tidak hanya staticberguna, itu cukup baik selalu akan diinginkan.
Pertama, perhatikan itu staticdan constexprsepenuhnya independen satu sama lain. staticmendefinisikan umur objek selama eksekusi; constexprmenentukan bahwa objek harus tersedia selama kompilasi. Kompilasi dan eksekusi saling terpisah dan terpisah, baik dalam waktu maupun ruang. Jadi begitu program dikompilasi, constexprtidak lagi relevan.
Setiap variabel yang dideklarasikan constexprsecara implisit consttetapi constdan statichampir ortogonal (kecuali untuk interaksi dengan static constbilangan bulat).
Model C++objek (§1.9) mensyaratkan bahwa semua objek selain dari bit-field menempati setidaknya satu byte memori dan memiliki alamat; selanjutnya semua objek yang dapat diamati dalam program pada saat tertentu harus memiliki alamat yang berbeda (paragraf 6). Ini tidak cukup membutuhkan kompilator untuk membuat array baru di stack untuk setiap pemanggilan fungsi dengan array const non-statis lokal, karena kompiler dapat berlindung pada as-ifprinsip asalkan dapat membuktikan bahwa tidak ada objek lain yang dapat dibuat. diamati.
Sayangnya, itu tidak mudah dibuktikan, kecuali fungsinya sepele (misalnya, tidak memanggil fungsi lain yang badannya tidak terlihat di dalam unit terjemahan) karena array, kurang lebih menurut definisi, adalah alamat. Jadi dalam kebanyakan kasus, const(expr)array non-statis harus dibuat ulang pada stack di setiap doa, yang mengalahkan titik untuk dapat menghitungnya pada waktu kompilasi.
Di sisi lain, static constobjek lokal dibagi oleh semua pengamat, dan selanjutnya dapat diinisialisasi bahkan jika fungsi yang didefinisikan tidak pernah disebut. Jadi tidak ada satu pun di atas yang berlaku, dan kompiler bebas tidak hanya untuk menghasilkan hanya satu instance saja; itu gratis untuk menghasilkan satu contoh dari itu dalam penyimpanan read-only.
Jadi, Anda harus menggunakan static constexprcontoh Anda.
Namun, ada satu kasus di mana Anda tidak ingin menggunakannya static constexpr. Kecuali constexprobjek yang dideklarasikan digunakan atau dideklarasikan ODRstatic , kompiler bebas untuk tidak memasukkannya sama sekali. Itu cukup berguna, karena memungkinkan penggunaan constexprarray sementara waktu kompilasi tanpa mencemari program yang dikompilasi dengan byte yang tidak perlu. Dalam hal ini, Anda jelas tidak ingin menggunakan static, karena statickemungkinan akan memaksa objek ada saat runtime.
constdariconstobjek, hanya dariconst X*yang menunjuk ke suatuX. Tapi bukan itu intinya; intinya adalah bahwa objek otomatis tidak dapat memiliki alamat statis. Seperti yang saya katakan,constexprberhenti menjadi bermakna setelah kompilasi selesai, jadi tidak ada yang dibuang (dan sangat mungkin tidak ada sama sekali, karena objek tersebut bahkan tidak dijamin ada saat runtime.)