5

Aşağıdaki örnekte hangi dönüştürme işlevi çağrılmalıdır? Neden diğeri üzerinde seçilmeli?Bir katkı ifadesinin ilk işleneni hem işaretçi hem de tamsayıya dönüştürülebilirse, hangi dönüşüm seçilir?

struct A 
{ 
    operator int(); 
    operator int*(); 
}; 

A x; 
int i = x + 1; 

derleyici operator int() seçer .. ama neden? İşte

bazı alakalı C++ gelen 03 tırnak gibidir: Ek için [expr.add]

itibaren

ya her iki işlenen aritmetik veya numaralandırma türünü sahip olacaktır, ya da bir işlenen bir olacaktır Tamamen tanımlanmış bir nesne tipine ve diğerine işaretçi entegre veya numaralandırma tipine sahip olmalıdır. Birkaç bağlamlarda [dönüşüm] Belirli bir tip

ifadeler örtük diğer türleri dönüştürülecektir itibaren

:

  • operatörlerin işlenen olarak kullanıldığında. işlenenlerinden için operatörün gereksinimleri hedef türü dikte
+2

Bunun muğlak olması gerektiğini savunuyorum. Düşünmüyorum * işaretsizler artık daha özel. – chris

+0

Eğer int * i = x + 1; 'derken diğerini çağırır mı? – John

+0

@John, Hayır, sadece int -> int * 'hakkında şikayet ediyor. – chris

cevap

9

Bu davranışın nedeni yerleşik onun sol işlenen olarak bir işaretçi kabul operatörü onun sağ işlenen olarak tip std::ptrdiff_t bir nesnesi kabul olmasıdır . Bu, C++ 11 standardın § 13.6 belirtilen: her bir ev nitelikli veya ev-olumlu bir amacı T türü için

şeklinde

T * operator+(T *, std::ptrdiff_t); 

[aday motor fonksiyonlarını orada var .. .] 1 yana

int tip vardır, derleyici gördüğü yerleşik bu onlys bir (kullanıcı tanımlı) conver gerektirdiğinden, daha iyi bir seçenek olarak iki int s alır operator + ilk argüman için sion. İşte

int i = x + static_cast<std::ptrdiff_t>(1); // AMBIGUOUS! 

bir live example şudur: operator + sağ işlenen olarak tip std::ptrdiff_t bir argüman sağlamışsa

, bekleneni belirsizlik görecekti.

+0

İyi çağrı. Bu senaryoda aşırı yüklenmenin kullanılmasının gerektiği belirtiliyor? – willj

+0

@willj: Dizüstü bilgisayarımı kapattım ve cep telefonumdan yazıyorum, bu yüzden tam olarak paragraf numarasını söyleyemiyorum, ancak 13. maddede bir yer var. yan tümce, –

+0

13 bulmak zor olmamalıdır.6 başlıyor "Madde 5'de tanımlanan yerleşik operatörleri temsil eden aday işleçler, bu alt bölümde numaralı belgede belirtilmiştir. Bu aday işlevler, 13.3.1.2'de açıklandığı şekilde operatör aşırı yük çözme işlemine katılır ve başka hiçbir amaçla kullanılmaz ." –