Rumah >pembangunan bahagian belakang >C++ >Mengapa Senarai Pemula Tidak Boleh Digunakan Secara Terus sebagai Operand dalam Ungkapan Operator Binari C?

Mengapa Senarai Pemula Tidak Boleh Digunakan Secara Terus sebagai Operand dalam Ungkapan Operator Binari C?

DDD
DDDasal
2024-12-09 17:56:10653semak imbas

Why Can't Initializer Lists Be Used Directly as Operands in C   Binary Operator Expressions?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn