2015-07-30 31 views
7

Bu, this question numaralı telefondan bir takiptir. OP sorusundaki kod, bana göre oldukça makul ve açık görünüyordu. böylece, parametrelerin tipleri dönüş türünü belirlemek için kullanılabilir ilan en az C++ 11, AyrıcaNeden C++, varsayılan değerler için kullanılan ikinci parametre parametrelerine izin vermiyor?

int foo(int a, int b = a); 

: Neden böyle bir şey ikincisi parametrelerin varsayılan değerleri tanımlamak için eski parametreler kullanılarak izin ++ C yapmaz benzer şekilde işlev parametreleri kullanmak duyulmamış değil:

auto bar(int a) -> decltype(a); 

Böylece soru: neden (ler) neden foo yukarıdaki beyanı izin verilmez nelerdir?

+4

bir nedeni bu anda tanımlanmamış işlev argümanı değerlendirme sipariş üzerine bir sınırlama, gerektirecektir aklı başında olmaktır C++. Bu geri dönüş tipi örnek için gerekli değildir. – MooseBoys

+0

Bunun yanısıra, bunun yapılacağı bir durum ekleyebiliyorsanız * diğer bir sorunun yanıtı olarak aşırı yüklenme ile elde edilemezse, * ihtiyaca * önemli bir yakıt ekleyecektir. * İhtiyaç * veya geriye dönük uyumluluk olmadan, standartlar komitesi özellik ekinde biraz muhafazakârdır. "Neden olmasın?" çok daha sıkı "neden" lehine. – WhozCraig

+0

Bir yan not olarak: C++ ('__cdecl' ve' __stdcall') 'da kullanılan en popüler iki çağrı kuralı [sağdan sola doğru sırala] (https://msdn.microsoft.com/en-us/library/984x0h58) .aspx) argümanı geçiyor. Bir işlev argümanı olarak trival olmayan (özel kurucuları içeren) parametrelerle hata ayıkladığınızda ve bu çağrıya adım atıyorsanız, kurucuların * gerçekte ters sırada çağrıldığını görebilirsiniz. –

cevap

7

Bir şey için, bu a'un b'dan önce değerlendirilmesini gerektirir, ancak C++ (C gibi) işlev parametrelerinin değerlendirme sırasını tanımlamaz.

Hala aşırı yüklenmeye ekleyerek istediğiniz etkiyi elde edebilirsiniz: Aklıma

int foo(int a, int b) 
{ /* do something */ } 

int foo(int a) 
{ return foo(a, a); } 
+1

C++ 'nın bir değerlendirme siparişi belirtmediği ile alakalı olduğunu göremiyorum. Bu özellik kullanıldığında parametrelerin daha sonraki varsayılan değerlerde kullanılmasına izin verilmesi elbette bazı kısmi sıralamayı zorlar. Ama bunun nasıl bir sorun olacağını anlamıyorum. Bence izin verilmemesinin sebebi, paranın çok küçük olacağıdır. –