İfade türleri, sürümler arasında C ++ ile neden değişti?


13

C ++ ifade türlerini anlamaya çalışıyorum ve ne kadar çok okursam, o kadar karıştı, çünkü C ++ taslağını sindirimi çok zor buluyorum ve bu nedenle diğer kaynakları tercih ediyorum ama ya birbirleriyle çelişiyorlar ya da C ++ sürümleri arasındaki ifadeler ve tanımlamalar büyük ölçüde değişir.

Aşağıda aşağıdaki taslaklara atıfta bulunuyorum:

  • C ++ 11 [ n3690 ] (son taslak)
  • C ++ 17 [ n4659 ] (son taslak)
  • C ++ 20 [ n4835 ] (mevcut taslak)

C++11 3.10 Değerler ve değerler

... Bir değer (“saf” değer) x değeri olmayan bir değerdir. [Örnek: Dönüş türü başvuru olmayan bir işlevi çağırmanın sonucu bir ön değerdir. 12, 7.3e5 veya true gibi bir değişmez değerin değeri de bir değerdir. - son örnek]

C++17 3.10 Değerler ve değerler

... Bir ön değer, değerlendirmesi bir nesneyi veya bir bit alanını başlatan veya bir operatörün işleneninin, içinde göründüğü bağlam tarafından belirtildiği şekilde hesaplayan bir ifadedir.

C++20 7.2.1 Değer kategorileri *

... Bir ön değer, değerlendirmesi bir nesneyi veya bit alanını başlatan ya da göründüğü bağlamla belirtildiği gibi bir işlecin işleneninin değerini veya cv void türüne sahip bir ifadeyi hesaplayan bir ifadedir.

İfade değişikliklerini anlıyorum ve bazı ayarlamalar yapılıyor, ancak benim için tüm tanım değişiklikleri. Birisi bunu anlamama yardımcı olabilir mi? Örneğin, neden bir değer, xvalue olmayan bir değerdir? Ya da faydalı örnek neden kaldırıldı?


3
Ben sadece sürüme özgü dil etiketlerini yasakladığım için. Tam olarak bu tür sorular hariç.
curiousguy


" C ++ sürümleri arasındaki ifadelerin ve tanımların büyük ölçüde değiştiğini dikkate almayın. " Ancak tanım gerçekten değişmedi. C ++ 11'de bir ön değer olan hemen hemen ifade C ++ 20'de bir ön değerdir.
Nicol Bolas

Versiyon arasındaki 'çelişki (iyon)' nerede? Sorunuz tam olarak nedir?
Galigator

1
C ++ 20 değişikliği için üzgünüm , ancak standartta bir tutarsızlık fark etmiştim.
Maggyero

Yanıtlar:


5

Orijinal değer tanımı sadece bir etiketti: belirli değerleri (yani x değeri olmayanları) bir kenara koyup onlara bir isim veriyoruz. Alışılmadık thiskullanım (az ya da çok geçici oldukları için) dışında adreslerini almak imkansızdır , bu nedenle yaratma ve yayılma ile hiçbir şey kırılmadan belirli özgürlükler alınabilir. (Ayrıca bkz . “Kimlik sahibi olmamaları” ile ilgili son tartışma ).

Yeni tanım açıkça bir ön değerin “gerçekleşmeyi bekleyen” bir başlatma olduğunu söylüyor: bunun için bir hedef nesne tanımlandığında, ilk kullanıma sunulan şey budur. (Bu başlatma hala olur dikkat etmek önemlidir zaman prvalue inşa edilmiştir, adil değil nerede öyle.) Bu zaten yaygındı eşdeğer optimizasyonu dayanan “zorunlu kopya elision” adıyla gider.

Örneğe gelince, yeni değer kategorisi tanımlarının çok daha basit olduğu ve daha az örneğe ihtiyaç duyulduğu görülmüştür. Xvalues ​​için hala bir tane var (bunlar en ince kategori).


Size ve yorumculara teşekkürler! Bu oldukça açıklıyor!
Daniel Stephens
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.