İlk olarak, şartname, 0mutlaka -1veya olması gerekmeyen, daha küçük, eşit veya daha büyük bir değer döndürecektir 1. İkincisi, dönüş değerleri rdeğerlerdir ve integral yükseltmeye tabidir, bu nedenle daha küçük bir şey döndürmenin bir anlamı yoktur.
C ++ 'da (C'de olduğu gibi), her ifade ya bir değerdir ya da bir değerdir. Tarihsel olarak, terimler, r değerlerinin yalnızca sağda görünebildiği bir atamanın solunda ldeğerlerin göründüğü gerçeğini ifade eder. Bugün, sınıf dışı tipler için basit bir yaklaşım, bir ldeğerin bellekte bir adresi olduğu, bir r değerinin olmadığıdır. Bu nedenle, bir rvalue adresini alamazsınız ve cv niteleyicileri ("erişim" koşulu) geçerli değildir. C ++ terimleriyle, sınıf türüne sahip olmayan bir rvalue, bir nesne değil, saf bir değerdir. Bir işlevin dönüş değeri, başvuru türü olmadığı sürece bir r değeridir. (Bir sicile uyan sınıf dışı tipler, örneğin bellekte değil, neredeyse her zaman bir kayıtta iade edilecektir.)
Sınıf türleri için, sorunlar nedeniyle bu gerçeği, biraz daha karmaşıktır olabilir bir rvalue üzerinde üye işlevleri çağırmak. Bu, r değerlerinin aslında this
işaretçi için adreslere sahip olması gerektiği anlamına gelir ve cv niteliği aşırı yük çözümlemesinde rol oynadığından, cv nitelikli olabilir. Son olarak, C ++ 11, rvalue referanslarını desteklemek için birkaç yeni ayrım sunar; bunlar da esas olarak sınıf türleri için geçerlidir.
İntegral yükseltme int, an'dan küçük integral türleri bir ifadede r değerleri olarak kullanıldığında çoğu bağlamda yükseltilecekleri gerçeğini ifade eder int. Dolayısıyla short a, b;, ifadede bir değişken tanımlanmış olsa bile a
+ b, her ikisi de ave toplama gerçekleşmeden önce byükseltilir int. Benzer şekilde, eğer yazarsam a < 0karşılaştırma yapılır, değeri abir int. Pratikte, bunun bir fark yarattığı çok az durum vardır, en azından tamsayı aritmetiğinin sarmalandığı 2'nin tamamlayıcı makinelerinde (yani bugün çok azı hariç hepsi - Unisys ana bilgisayarlarının geriye kalan tek istisna olduğunu düşünüyorum). Yine de, daha yaygın makinelerde bile:
short a = 1;
std::cout << sizeof( a ) << std::endl;
std::cout << sizeof( a + 0 ) << std::endl;
farklı sonuçlar vermelidir: ilki eşdeğerdir
sizeof( short ), ikincisi sizeof( int )(integral terfi nedeniyle).
Bu iki konu resmi olarak ortogonaldir; r değerlerinin ve l değerlerinin integral ilerlemeyle ilgisi yoktur. Bunun dışında ... integral yükseltme yalnızca rdeğerleri için geçerlidir ve bir rvalue kullanacağınız durumların çoğu (ancak hepsi değil) integral yükseltmeyle sonuçlanır. Bu nedenle, bundan daha küçük bir şeyde sayısal bir değer döndürmek için gerçekten bir neden yoktur int. Karakter türü olarak döndürmemek için çok iyi bir neden var. Aşırı yüklenmiş operatörler, örneğin <<, karakter türleri için genellikle farklı davranır, bu nedenle karakterleri yalnızca karakter türleri olarak döndürmek istersiniz. (Farkı şu şekilde karşılaştırabilirsiniz:
char f() { return 'a'; }
std::cout << f() << std::endl; // displays "a"
std::cout << f() + 0 << std::endl; // displays "97" on my machine
Aradaki fark, ikinci durumda, eklemenin, farklı bir aşırı yüklemenin <<seçilmesine yol açacak şekilde, integral yükselmenin meydana gelmesine neden olmasıdır .