2011-11-26 21 views
6

Bunu anlamıyorum:"Alternatif dilbilgisi" ne [yanı sıra öznitelikler içinde görünür?

(7.6.1) İki ardışık sol köşeli ayraç belirteçleri sadece bir nitelik-spesifik fi er tanıştırırken görünmelidir. [Not: Bir özelliğin köşeli parantezinin bir ardışık özelliğe izin verilmediği yerde görünürse, programı, dilbilgisi üretiminin köşeli parantezleri üretilmesine rağmen bozuktur. ] [Örnek ucuna bağlı bir vaziyette Not: (biraz kaynaktan değiştirilmiş)

// ... 
void f() { 
int x = 42, y[5]; 
    // ... 
    y[[] { return 2; }()] = 2; // error even though attributes are not allowed 
          // in this context. 
} 

alternatif ne gramer [[ için kullanılabilir? Öznitelik yoksa örnek geçerli olur mu (ve örnek ne yapar?)

+4

Bir felaketin sonuna kadar gidebileceğine dair bir fikrim var: teknik olarak belirli bir yolla ayrıştırılması gerekiyor, ancak zamanla bir süre sonra ortaya çıkacak olan sıkıntı ortaya çıkacak ve standart kısıtlılık yaratabilecektir. Bununla birlikte, çok sayıda durum özniteliğinin kullanılabileceği düşünüldüğünde, derleyicileri her zaman ayrıştırmak için çok daha basit bir iş çıkarmaktadır. [['Bir öznitelik belirteci olarak (ki bu da özelliği daha kolay devam ettirir). – GManNickG

+0

@GMan: Görünüşe göre, lambda'lardan, özniteliklerin dışında bir [[belirteci ”elde etmek için başka bir yol yoktur. – Xeo

+0

@Xeo: C + + 0x dilbilgisi ile sadece Ctrl + F'd ve bu doğru gibi görünüyor. Öznitelik konusunda uzman değilim ve bunun geçerli olacağını düşünmüyorum, ama lambda gerektirmeyen bir yöntem: struct {void operator [] (void *) {}} x; x [[[blah]] yeni int]; '. Bunun gibi bir öznitelik uygulayabileceğinizi sanmıyorum ama bu genel bir fikir. – GManNickG

cevap

2

Örnek, doğrudan çağrılan ve yalnızca 2 döndürecek basit bir lambda oluşturur. Bu üçüncü öğeyi diziden alır ve 2'a atar. şöyle yazılabilirdi: bölüm olsam alıntı çünkü

int foo(){ return 2; } 

int y[5]; 

y[foo()] = 2; 

Hatta

int y[5]; 

auto foo = []{ return 2; }; // create lambda 

y[foo()] = 2; // call lambda 

Şimdi, nitelikleri olmasaydı, örnek tabii ki, iyi kurulacağını Var.

+0

Oh! Bu mantıklı. Başka durumlar olması durumunda bunu bir süre açık bırakacağım. – Pubby

+3

@Tubby: Lambda indükleyici dizisi olarak seçilmiş olan [] 'nin nedeni, meşru bir durum olmadığı için [' bir tanımlayıcı ya da onun önünde başka bir ifade olmadan kullanılabilir. Yani, lambdas olmadan, hiçbir şekilde '[[o] sembollerin meşru bir dizisi olabilir. –

+5

Gerçekte bir çift '()' eklenmesi, geçici çözüm için yeterli olmalıdır. 'y [([] {return 2;}())] = 2;' – kennytm

İlgili konular