2013-05-02 26 views

cevap

26

Bu konuda% 100 olumlu değilim, ancak bu bir sözdizimi belirsizliğini önlemek olabilir. Örneğin, şu sınıfı dikkate alın:

class BadTimes { 
    struct Overloaded; 
    int Overloaded;   // Legal, but a very strange idea. 

    int confusing(Overloaded); // <-- This line 
}; 

Belirtilen çizgi ne anlama geliyor? Yazıldığı gibi, bu, Overloaded türünde bir nesne (işlev bildirimi içinde adı belirtilmemiş) bir parametre olarak kabul eden ve int değerini döndüren confusing adında bir üye işlevinin bir bildirimidir. C++ 11, başlatıcıların parantez kullanmasına izin verecek olsaydı, bu durum belirsiz olurdu, çünkü tipinde confusing isimli bir üye tanımı, Overloaded veri elemanının değerine ilklendirilmiştir. (. Bu Most Vexing Parse ile cari konuyla ilgilidir)

küme parantezi gerektiren olarak, bu belirsizlik kaldırılır:

class BadTimes { 
    struct Overloaded; 
    int Overloaded;   // Legal, but a very strange idea. 

    int confusing{Overloaded}; // <-- This line 
}; 

Şimdi, confusing aslında Overloaded değerine başlatıldı bir int olduğu açıktır Çünkü bunu bir işlev beyanı olarak okumanın bir yolu yoktur.

Bu yardımcı olur umarız!

+1

"Kafa karıştırıcı" ifadesinin neden tanım ve açıklama olmadığını ayrıntılı olarak açıklayabilir misiniz? ** "Bu," Overloaded "türünde bir nesne olarak parametre kabul eden kafa karıştırıcı adlı bir üye işlevinin tanımıdır. Bu karışıklığa sahibim, çünkü belirsiz olmalı? –

+1

@ Koushik- Haklısın, bu açıklama değil, tanım olmalı. Bunu düzeltmeme izin ver. – templatetypedef