2014-07-10 53 views

cevap

16

Bu soru bana yeni bir şeyler öğrenme şansı verdi, ben de burada paylaşıyorum, Aşağıdaki pasajı yazmadım! C++, bir tip ilk seviye için geçerli olan bir ev-eleme olarak


bir üst düzey olarak ev-niteleyici olarak adlandırılır. Örneğin,:

T *const p; 

üst düzey ev-eleme const ve içinde:

T const *volatile q; 

üst düzey ev-eleme volatile olup. Diğer taraftan, herhangi bir üst düzey cv-niteleyicisi bulunmamaktadır. Bu durumda, cv-niteleyicileri const ve volatile ikinci seviyede görünür.

Bir işlevin imzası, bir parametre türünün en üst düzeyinde görünen niteleyiciler haricinde, bu işlevin parametre türlerinde görünen tüm cv kalifikasyonlarını içerir. Örneğin

:

int f(char const *p); 

const eleme parametre bildiriminde üst düzeyinde değil, bu nedenle işlevin imza parçasıdır. Diğer taraftan

,: o işlevin imza parçası değil bu yüzden

int f(char *const p); 

const eleme, üst düzeydedir.

int f(char *p); 

Kaynak: Ben de ama ne Yukarıdaki haberi açıkça N3337 belirtilmiştir standardında bir tanım bulamadı Top-Level cv-Qualifiers in Function Parameters

§8.3.5-5 Bu fonksiyon ile aynı imzası vardır fonksiyon tipi oluşturulurken

parametre türleri listesini üretmek sonra bir parametre türü modifiye herhangi bir üst düzey ev-kalifiye silinir.


Düzenleme: Yukarıdaki postayı standardında bir tanım yazma zamanda buldum ama şimdi var olamazdı biri as pointed out by Shafik:

n4296 alıntı: Bunda

Uluslararası Standart, notasyon cv (veya cv1, cv2, vb.)), Türlerin açıklamasında kullanılan cv-niteleyicileri, yani {const}, {volatile}, {const, volatile} veya boş setinden oluşan rastgele bir grubu temsil eder. Bir cv T türü için, bu türünün en üst düzey cv-niteleyicileri, cv. [Örnek: türünde tanımlanmış int int &'a karşılık gelen tür, üst düzey bir cv eleme sahip değildir. Tipik uçucu int * const'a karşılık gelen tipi üst düzey cv-niteleyici yapısına sahiptir. C sınıfı bir sınıf için, type-id void (C :: * volatile) (int) const'a karşılık gelen tür, üst düzey cv-niteleyicisi volatiline sahiptir. - son örnek]

+2

Yine de soruyu yanıtlamıyor. – juanchopanza

+0

@juanchopanza Düzenlendi: Açıkça açıklamak için standartta bir tanım yok ama üst düzey sıyırma işlevini bildiren bir geçit ekledim. –

+1

Standard'ın 'en üst düzey cv-niteleyiciler' için bir tanımı yok gibi görünüyor. Yukarıda verilen mükemmel makale için cevabınızı kabul ediyorum. Teşekkürler. – Mao

3

Yalnızca standarttaki ifadenin bir örneğini ve norm dışı bir notta bulunan buldum. herhangi bir başka tanımdan yoksun olmak, ifadenin, normal olarak İngilizce olacak şekilde ifadenin yorumlandığını varsaymalıdır; niteleyicinin, tip beyanının en yüksek seviyesinde olması. Tabii ki genellikle no'lu bildirimleri (C++ 'da değil) soldan sağa, no'lu adreslerde yazıyoruz, ancak normal kurallar geçerli: soldan önce geliyor ve yukarı aşağı geliyor. Yani char *const p gibi bir şey için, onu (ingilizce) yazacağız: "p bir char işaretçisidir". (Bu durumda, İngilizce, C++ 'da kullanacağımız sıranın tam tersi olan 'dur. Ancak, bu her zaman böyle değildir, .) const işaretçiyi değiştirdiğinden, bu en çok (üstte) öğesidir. üst düzey bir niteleyicidir.

+2

yazımında bu tanımı ekledi. Örneğindeki en soldaki eleman, "char", işaretçiden ayrı olarak da kalifiye olabilir ... Yoksa İngilizce versiyonundan mı bahsediyorsun? Açıklamanız kafa karıştırıcı. – rubenvb

+0

@rubenvb ingilizce sürümü hakkında konuşuyorum. C++ sürümünde en çok bulunanı bulmak ayrıştırma gerektirir. Hangisi en soldaki ingilizce versiyonda ortaya çıkıyor. –

+0

C++ 'da en üstte en sağdaki, en değil mi? – rubenvb

6

Bu soru diyor defect report 609: What is a “top-level” cv-qualifier? konusudur:

ifade “üst düzey cv-eleme” Standart defalarca kullanılır, ancak tanımlı değil. İfade, T & yapısı gibi bir yapıda bulunan yapının “üst düzey” olduğunu belirtmek için yanlış anlaşılmış olabilir, çünkü göründüğü en yüksek seviyedeyse, T & const bozuktur.

ve teklif edilen çözünürlük aşağıdaki şekilde ve not ekleyerek göstermektedir: bir tür cv T için

, bu tür üst-düzey ev-kalifiye olan cv ile gösterilir. [Örnek: type-id “const int &” 'a karşılık gelen tür, üst düzey bir cv-eleme sahip değildir. Type-id “volatile int * const” öğesine karşılık gelen tür, üst düzey cv-niteleyici const'a sahiptir. C sınıfı bir sınıf için, type-id “void (C :: * volatile) (int) const” 'a karşılık gelen tip, üst düzey cv-niteleyici uçucusuna sahiptir. -end örnek]

kusur şimdi son taslak standardının bir parçasıdır ve biz N4527 yeni ifadeler bulmak anlamına gelir DRWP için statü değişti

Güncelleme.

İlgili konular