Senarai Pemasal dalam Ungkapan Operator: Dilema
Dalam C , senarai pemula, yang disertakan dalam pendakap kerinting, menyediakan cara yang mudah untuk memulakan pembolehubah . Walau bagaimanapun, soalan yang menarik timbul apabila cuba menggunakan senarai pemula dalam ungkapan operator. Pertimbangkan kod berikut:
class foo { }; struct bar { template<typename... T> bar(T const&...) { } }; foo& operator<<(foo& f, bar const&) { return f; } int main() { foo baz; baz << {1, -2, "foo", 4, 5}; // This line gives an error return 0; }
Mengapa kod ini menghasilkan ralat, khususnya berkaitan dengan baris yang mengandungi ungkapan baz << {1, -2, "foo", 4, 5};? Sebabnya terletak pada takrifan senarai pemula C Standard.
Senarai Pemula: Pengecualian kepada Ungkapan
Di bawah §5 Standard, ungkapan ditakrifkan dengan tepat. Anehnya, senarai pemula tidak dianggap sebagai ungkapan itu sendiri. Pengendali binari, termasuk <<, mengharapkan ungkapan sebagai hujah mereka. Oleh itu, memandangkan senarai pemula tidak memenuhi kriteria ini, ia tidak boleh digunakan secara langsung sebagai operan pengendali binari.
Pengecualian Terhad
Standard menyediakan beberapa pengecualian untuk pemula- penggunaan senarai, termasuk sebagai argumen fungsi dan dalam pernyataan tugasan. Walau bagaimanapun, pengecualian tidak meliputi pengendali binari.
Sebab Sekatan
Rasional untuk sekatan ini adalah pelbagai. Menurut draf/kertas perbincangan N2215, membenarkan senarai pemula kerana kedua-dua operator sebelah kiri dan kanan operator akan memperkenalkan kerumitan tatabahasa yang akan mencabar penghurai. Pengarang kertas akhirnya memutuskan bahawa membenarkan mereka di sebelah kanan tetapi tidak di sebelah kiri akan menjadi terlalu menyusahkan.
Kesimpulan
Semasa pemula menyenaraikan menawarkan kemudahan dalam konteks tertentu, penggunaan terhad mereka di sebelah kanan pengendali berpunca daripada cabaran sintaksis dan keinginan untuk konsisten dalam tatabahasa bahasa. Sebagai alternatif kepada senarai pemula sebagai operan, seseorang boleh menggunakan invokasi pembina atau menghantar contoh bar terus sebagai hujah kepada operator<<(), seperti yang dilihat dalam kod yang diubah suai:
baz << bar{1, -2, "foo", 4, 5};
Atas ialah kandungan terperinci Mengapa Senarai Pemula Tidak Boleh Digunakan Secara Terus sebagai Operand dalam Ungkapan Operator Binari C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!