Pada pandangan pertama, tampaknya itu adalah gula sintaksis sederhana.
Tetapi ketika melihat lebih dalam, kita melihat itu lebih dari gula sintaksis, karena memperluas opsi pengguna C ++ untuk membuat tipe yang ditentukan pengguna yang berperilaku persis seperti tipe bawaan yang berbeda. Dalam hal ini, "bonus" kecil ini adalah tambahan C ++ 11 yang sangat menarik untuk C ++.
Apakah kita benar-benar membutuhkannya di C ++?
Saya melihat beberapa kegunaan dalam kode yang saya tulis dalam beberapa tahun terakhir, tetapi hanya karena saya tidak menggunakannya dalam C ++ tidak berarti itu tidak menarik untuk pengembang C ++ lainnya .
Kami telah menggunakan dalam C ++ (dan dalam C, saya kira), literal yang ditentukan compiler, untuk mengetikkan bilangan bulat sebagai bilangan bulat pendek atau panjang, bilangan real sebagai float atau double (atau bahkan double panjang), dan string karakter sebagai karakter normal atau lebar karakter .
Di C ++, kami memiliki kemungkinan untuk membuat tipe kami sendiri (yaitu kelas), dengan kemungkinan tidak ada overhead (inlining, dll.). Kami memiliki kemungkinan untuk menambahkan operator ke tipenya, agar mereka berperilaku seperti tipe bawaan yang serupa, yang memungkinkan pengembang C ++ untuk menggunakan matriks dan bilangan kompleks secara alami seperti yang akan mereka miliki jika ini telah ditambahkan ke bahasa itu sendiri. Kami bahkan dapat menambahkan operator cor (yang biasanya merupakan ide yang buruk, tetapi kadang-kadang, itu adalah solusi yang tepat).
Kami masih melewatkan satu hal untuk berperilaku tipe pengguna sebagai tipe bawaan: literal yang ditentukan pengguna.
Jadi, saya kira itu adalah evolusi alami untuk bahasa, tetapi untuk selengkap mungkin: " Jika Anda ingin membuat suatu jenis, dan Anda ingin agar berperilaku sebanyak mungkin sebagai jenis bawaan, berikut adalah alat-alatnya. .. "
Saya kira itu sangat mirip dengan keputusan .NET untuk membuat setiap primitif sebuah struct, termasuk boolean, integer, dll., Dan memiliki semua struct berasal dari Object. Keputusan ini sendiri menempatkan .NET jauh di luar jangkauan Java ketika bekerja dengan primitif, tidak peduli berapa banyak hacking tinju / unboxing yang akan ditambahkan Java ke spesifikasinya.
Apakah ANDA benar-benar membutuhkannya di C ++?
Pertanyaan ini untuk ANDA jawab. Bukan Bjarne Stroustrup. Bukan Herb Sutter. Bukan apa pun anggota komite standar C ++. Inilah sebabnya mengapa Anda memiliki pilihan dalam C ++ , dan mereka tidak akan membatasi notasi yang berguna untuk tipe bawaan saja.
Jika Anda membutuhkannya, maka itu adalah tambahan selamat datang. Jika Anda tidak, baik ... Jangan menggunakannya. Anda tidak akan dikenakan biaya.
Selamat datang di C ++, bahasa tempat fitur opsional.
Bengkak??? Tunjukkan kompleksmu !!!
Ada perbedaan antara kembung dan kompleks (pun intended).
Seperti yang ditunjukkan oleh Niels di Apa kemampuan baru yang ditambahkan oleh literal yang ditetapkan pengguna ke C ++? , bisa menulis bilangan kompleks adalah salah satu dari dua fitur yang ditambahkan "baru-baru ini" ke C dan C ++:
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
Sekarang, tipe C99 "komplek ganda" dan tipe C ++ "std :: complex" dapat dikalikan, ditambahkan, kurangi, dll., Menggunakan operator yang berlebihan.
Namun di C99, mereka hanya menambahkan tipe lain sebagai tipe bawaan, dan dukungan operator berlebih bawaan. Dan mereka menambahkan fitur literal bawaan lainnya.
Dalam C ++, mereka hanya menggunakan fitur bahasa yang ada, melihat bahwa fitur literal adalah evolusi alami dari bahasa, dan dengan demikian menambahkannya.
Di C, jika Anda memerlukan peningkatan notasi yang sama untuk tipe lain, Anda kurang beruntung sampai lobi Anda menambahkan fungsi gelombang kuantum (atau titik 3D, atau tipe dasar apa pun yang Anda gunakan di bidang pekerjaan) ke Standar C sebagai tipe bawaan berhasil.
Di C ++ 11, Anda bisa melakukannya sendiri:
Point p = 25_x + 13_y + 3_z ; // 3D point
Apakah kembung? Tidak , perlu ada di sana, seperti yang ditunjukkan oleh bagaimana kedua kompleks C dan C ++ membutuhkan cara untuk mewakili nilai kompleks literal mereka.
Apakah desainnya salah? Tidak , ini dirancang seperti setiap fitur C ++ lainnya, dengan ekstensibilitas dalam pikiran.
Apakah hanya untuk keperluan notasi? Tidak , karena bahkan dapat menambahkan keamanan jenis ke kode Anda.
Misalnya, mari kita bayangkan kode berorientasi CSS:
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
Maka sangat mudah untuk menerapkan pengetikan yang kuat untuk penugasan nilai.
Apakah ini berbahaya?
Pertanyaan bagus. Bisakah fungsi-fungsi ini di-namespace? Jika ya, maka Jackpot!
Bagaimanapun, seperti semua hal lainnya, Anda dapat bunuh diri jika alat digunakan secara tidak benar . C sangat kuat, dan Anda bisa menembak kepala Anda jika Anda menyalahgunakan senjata C. C ++ memiliki senjata C, tetapi juga pisau bedah, taser, dan alat apa pun lainnya yang akan Anda temukan di toolkit. Anda bisa menyalahgunakan pisau bedah dan membuat darah Anda mati sendiri. Atau Anda dapat membuat kode yang sangat elegan dan kuat.
Jadi, seperti setiap fitur C ++, apakah Anda benar-benar membutuhkannya? Ini adalah pertanyaan yang harus Anda jawab sebelum menggunakannya dalam C ++. Jika tidak, Anda tidak perlu membayar apa-apa. Tetapi jika Anda benar-benar membutuhkannya, setidaknya, bahasa tersebut tidak akan mengecewakan Anda.
Contoh tanggal?
Kesalahan Anda, menurut saya, adalah Anda menggabungkan operator:
1974/01/06AD
^ ^ ^
Ini tidak dapat dihindari, karena / sebagai operator, kompiler harus mengartikannya. Dan, AFAIK, itu hal yang baik.
Untuk menemukan solusi untuk masalah Anda, saya akan menulis literal dengan beberapa cara lain. Sebagai contoh:
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
Secara pribadi, saya akan memilih integer dan tanggal ISO, tetapi itu tergantung pada kebutuhan ANDA. Yang merupakan inti dari membiarkan pengguna menentukan nama literalnya sendiri.