2017-05-01 34 views
7

Aşağıdaki kod göz işaretçi ile ilişkili operatörler uygulanması:örtük dönüştürme

struct X 
{ 
    int x; 
}; 

X xInstance; 

class A 
{ 
public: 
    operator X*() 
    { 
     return &xInstance; 
    } 
}; 

int main() 
{ 
    A a; 
    *a = X(); // ok 
    a[0] = X(); // ok 
// a->x = 0; // error 
} 

A bir işaretçi türüne örtülü bir dönüşüm vardır. Bir işaretçinin gerekli olduğu üç bağlamda kullanmayı denerim; iki ilk satır gayet iyi, ancak 'a dolaylı dönüşüme dayanarak struct Xoperator-> arasındaki bir alana başvurmaya çalışmaz. Neden? Kavramsal olarak, bu bağlamda operator[]operator->'dan nasıl farklı?

g++ 6.3.0 ile test edilmiştir ve aşırı yük dönüştürme amacıyla yerleşik operatörler temsil VC++ 2017

cevap

6

Standart bölüm 13.6 listeleri "aday operatör fonksiyonları". Bir operatörün en az bir alt ifadesinin sınıf veya enum türüne sahip olması durumunda, aşırı yük çözünürlüğü için dikkate alınan işlevlerin listesi, üye olmayan [email protected], üye araması [email protected]'un bir araya gelmesi ve bu aday operatör işlevleridir. Çoğu operatör için, aday operatör işlevleri yerleşik operatör tarafından izin verilen tüm türleri temsil edecek kadar geneldir. Örneğin, her bir ev nitelikli veya CV için şeklinde

T& operator*(T*); 

her ev nitelikli T veya ev-niteliksiz nesne türü , orada mevcut aday operatör fonksiyonları için

-Uzunlaştırılmış nesne türü T formunun

formundaki aday operatör işlevleri vardır.
T& operator[](T*, std::ptrdiff_t); 
T& operator[](std::ptrdiff_t, T*); 

Eğer *a veya a[0], aday operatör fonksiyonu gelen kazanır aşırı yük çözünürlüğü yazmak, alt ifadelere aday operatör fonksiyonunun bağımsız değişken türleri dönüştürülür ve daha sonra sıradan yerleşik operatör kuralları uygularlar. Ancak, bu bölüm operator-> için herhangi bir aday işleç işlevini listelemez. Yani a sınıf türüne sahipse, a->x için mümkün olan tek işlev a.operator->()'un üye aramasıdır. (Üye olmayan arama, her zaman bir üye işlevi olması gereken operator-> için geçerli değildir.)

+0

C++ 14 [over.match.oper] /3.3 özellikle "operator->" (ve " operatör & ') yerleşik adaylar set boş –

+0

@ MM İyi yakalama. Orada bir yerlerde olduğunu sanıyordum. – aschepler

İlgili konular