Adakah Constexpr Menyiratkan Sebaris dalam C 11?
Piawaian C 11 memperkenalkan penentu constexpr, yang membolehkan fungsi dan pembolehubah dinilai pada masa menyusun. Ini telah membawa kepada beberapa kekeliruan tentang hubungan antara constexpr dan sebaris.
Penentukan sebaris mengarahkan pengkompil untuk melaksanakan pengembangan sebaris fungsi. Ini bermakna kod fungsi akan dimasukkan terus ke dalam kod tempat fungsi dipanggil, dan bukannya mencipta fungsi berasingan yang dipanggil secara tidak langsung.
Penentukan constexpr tidak secara eksplisit membayangkan penentu sebaris. Walau bagaimanapun, piawaian C 11 menyatakan bahawa "fungsi constexpr dan pembina constexpr secara tersirat sebaris" (§7.1.5/2).
Implikasi
Ini bermakna bahawa pengkompil dikehendaki mengikut peraturan yang sama untuk fungsi constexpr seperti yang dilakukan untuk fungsi sebaris. Khususnya, pengkompil boleh menyelaraskan fungsi, walaupun ia dipanggil dengan argumen bukan malar.
Contoh
Pertimbangkan contoh berikut:
<code class="cpp">#include <iostream> #include <cstdlib> inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); }</code>
Dalam contoh ini, fungsi f adalah sebaris, walaupun ia dipanggil dengan hujah tidak tetap. Ini kerana fungsi f diisytiharkan sebagai sebaris.
Kesimpulan
Penentukan constexpr tidak secara eksplisit membayangkan penentu sebaris. Walau bagaimanapun, piawaian C 11 memerlukan pengkompil untuk berkelakuan seolah-olah fungsi constexpr adalah fungsi sebaris. Ini bermakna pengkompil boleh menyelaraskan fungsi constexpr dengan selamat, walaupun ia dipanggil dengan hujah tidak tetap.
Atas ialah kandungan terperinci Adakah `constexpr` Menyiratkan `sebaris` dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!