Bolehkah Pembina Templat Kelas Mempunyai Senarai Parameter Templat Berlebihan dalam C 20?
Dalam C 17, adalah dibenarkan untuk mengisytiharkan pembina templat kelas dengan senarai parameter templat yang berlebihan, seperti yang ditunjukkan oleh kod berikut:
template<typename T> struct S { S<T>(); };
Walau bagaimanapun, dengan kemunculan C 20 dan pelaksanaan perubahan keserasian, kod yang disebutkan di atas kini menimbulkan ralat pada batang GCC (untuk -std=c 20). Batang clang, sebaliknya, menyusun kod tanpa masalah. Ketidakkonsistenan ini menimbulkan persoalan: adakah ini pepijat atau perubahan pemecah yang dimaksudkan yang masih belum dilaksanakan sepenuhnya merentas penyusun?
Jawapannya
Jawapannya terletak pada perubahan halus dalam spesifikasi C 20. Khususnya, bahagian berikut telah disemak:
[class.ctor]
"Pembina diperkenalkan oleh pengisytiharan yang pengisytiharnya ialah pengisytihar fungsi bagi borang:
ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq
Di mana ptr-declarator terdiri semata-mata daripada id-expression, optional attribute-specifier-seq, dan pilihan kurungan sekeliling, dan id-expression mempunyai salah satu daripada bentuk berikut:"
Dalam kes pengisytiharan ahli dalam templat kelas, ungkapan id kini mestilah nama kelas yang disuntik bagi entiti yang dilampirkan serta-merta.
Oleh itu, sementara C 17 membenarkan S
Oleh itu, ralat yang dihadapi pada batang GCC dengan -std=c 20 bukanlah pepijat tetapi petunjuk pemecahan perubahan yang diperkenalkan dalam C 20. Penyusun yang belum melaksanakan perubahan ini akan terus menyusun kod lama dengan jayanya, manakala mereka yang telah melaksanakannya akan mematuhi keperluan baharu.
Atas ialah kandungan terperinci Bolehkah Pembina Templat Kelas C 20 Mengeluarkan Senarai Parameter Templat Berlebihan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!