Mengapa tipe ekspresi berubah dalam C ++ antar versi?

13

Saya mencoba untuk memahami jenis ekspresi C ++ dan semakin banyak saya membaca, semakin bingung saya, karena saya menemukan konsep C ++ sangat sulit untuk dicerna dan oleh karena itu lebih suka sumber daya lain tetapi mereka saling bertentangan atau tidak memperhitungkan bahwa kata-kata dan definisi antara versi C ++ sangat berubah.

Berikut ini saya merujuk ke draft berikut:

  • C ++ 11 [ n3690 ] (konsep terakhir)
  • C ++ 17 [ n4659 ] (draft terakhir)
  • C ++ 20 [ n4835 ] (konsep saat ini)

C++11 3.10 Nilai dan nilai

... Prvalue ("pure" rvalue) adalah rvalue yang bukan xvalue. [Contoh: Hasil memanggil fungsi yang tipe kembaliannya bukan referensi adalah nilai awal. Nilai literal seperti 12, 7.3e5, atau true juga merupakan nilai awal. - contoh akhir]

C++17 3.10 Nilai dan nilai

... Nilai awal adalah ekspresi yang evaluasinya menginisialisasi objek atau bit-field, atau menghitung nilai operan operator, sebagaimana ditentukan oleh konteks di mana ia muncul.

C++20 7.2.1 Kategori nilai *

... Nilai awal adalah ekspresi yang evaluasinya menginisialisasi objek atau bit-field, atau menghitung nilai operan operator, seperti yang ditentukan oleh konteks di mana ia muncul, atau ekspresi yang memiliki tipe cv void.

Saya akan memahami perubahan kata-kata, dan beberapa penyesuaian dilakukan, tetapi bagi saya seluruh definisi berubah. Adakah yang bisa membantu saya untuk memahami hal ini? Misalnya, mengapa kalimat dihapus bahwa nilai awal adalah nilai yang bukan nilai tambah? Atau mengapa contoh yang bermanfaat dihapus?

Daniel Stephens
sumber
3
Saya semua untuk melarang tag bahasa khusus versi. Kecuali untuk pertanyaan seperti ini.
curiousguy
" Jangan memperhitungkan bahwa kata-kata dan definisi antara versi C ++ sangat berubah. " Tetapi definisi itu tidak benar-benar berubah. Ekspresi yang cukup banyak yang merupakan nilai di C ++ 11 masih merupakan nilai di C ++ 20.
Nicol Bolas
Di mana 'kontradiksi (ion)' antara versi? Apa pertanyaan Anda sebenarnya?
Galigator
1
Maaf untuk perubahan C ++ 20 , tapi saya perhatikan ada ketidakkonsistenan dalam standar.
Maggyero

Jawaban:

5

Definisi nilai awal yang asli hanya label: kami menyisihkan nilai-nilai tertentu (yaitu, yang bukan nilai-x) dan memberi mereka nama. Tidak mungkin untuk mengambil alamat mereka kecuali melalui thispenggunaan yang tidak biasa (lebih atau kurang karena bersifat sementara), sehingga kebebasan tertentu dapat diambil dengan kreasi dan penyebarannya tanpa merusak apa pun. (Lihat juga diskusi terbaru tentang mereka yang tidak “memiliki identitas”.)

Definisi baru secara eksplisit mengatakan bahwa nilai awal adalah inisialisasi "menunggu untuk terjadi": sekali objek target diidentifikasi untuk itu, itulah yang akan diinisialisasi. (Penting untuk dicatat bahwa inisialisasi masih terjadi ketika nilai dibangun, bukan di mana itu berada.) Ini berjalan dengan nama "wajib copy wajib" berdasarkan optimasi setara yang sudah umum.

Sebagai contoh, definisi kategori nilai baru dilihat sebagai jauh lebih sederhana sehingga dibutuhkan lebih sedikit contoh. Masih ada satu untuk xvalues ​​(yang merupakan kategori paling subtil).

Davis Herring
sumber
Terima kasih untuk Anda dan para komentator! Cukup banyak menjelaskannya!
Daniel Stephens