2012-02-13 20 views
12

Sadece şu şaşırtıcı ifadeyi (§13.6/8) draft of the C++11 standard üzerinden tarama ve tespit edilmiştir: Formun aday operatör fonksiyonları vardır mevcut T her türü içinUnary +

T* operator+(T*); 

İşaretçideki bu "unary +" operatörü nasıl anlaşılmalıdır? Bu, normal durumda, ancak aşırı yüklenebilen bir op-op mu? Yoksa burada daha da eksik olan bir nokta var mı?

cevap

8

Sorunuzun cevabı sen — §13.6/1 anılan alıntı yukarıda sadece bir sayfası:

Madde 5'de tanımlanan yerleşik operatörler Bu alt belirtilen temsil aday operatör fonksiyonları . Bu aday fonksiyonlar, 13.3.1.2'de açıklandığı gibi operatör aşırı yük çözme işlemine katılır ve başka hiçbir amaçla kullanılmaz. [Not: Yerleşik işleçler yalnızca sınıf dışı türdeki işlenenleri aldığından ve operatör aşırı yüklenme özünürlüğü, yalnızca bir işlenen ifadesi başlangıçta sınıf veya numaralandırma türüne sahip olduğunda gerçekleştiğinden, operatör aşırı yükü özünürlüğü yerleşik bir operatöre yalnızca Bir işlenenin, kullanıcı için uygun sınıf dışı bir türe kullanıcı tarafından tanımlanan bir dönüşüme sahip olan bir sınıf türü veya bir işlenenin, operatör için uygun bir türe dönüştürülebilen bir numaralandırma türüne sahip olması durumunda vardır. Ayrıca, bu alt bölümde verilen aday operatör fonksiyonlarının bazılarının yerleşik operatörlerden daha fazla izin verdiğine dikkat ediniz. 13.3.1.2'de açıklandığı gibi, yerleşik bir operatör aşırı yüklenme çözünürlüğü tarafından seçildikten sonra ifade, Madde 5'te verilen yerleşik operatöre ve bu nedenle orada verilen ek anlamsal kısıtlamalara yönelik gereksinimlere tabidir. Yerleşik bir aday operatör işlevi ile aynı ada ve parametre türlerine sahip kullanıcı tarafından yazılmış bir aday varsa, yerleşik operatör işlevi gizlidir ve aday işlevler kümesine dahil edilmez. -end not]

+0

So 'T * operatörü + (T *);' üye mi yoksa global mi? ve lambda -> '+ [] {};' 't' nedir merak ediyorum? Teşekkürler –

+0

@AngelusMortis: İşaretçiler üye olamaz; Bu, aritmetik türler için dilin yerleşik unary 'operatörünü + kullanır.Ve türkçe olmayan lambdalar üzerinde “operatör +” un lambda'yı bir fonksiyon göstergesine dönüştürdüğü gibi, * + [] {} '' 'void (*)()' dır. – ildjarn

+0

Sevgili efendim, ben hala biraz kafam karıştı, bu yüzden lemme ifadelerinizi alıntılayarak isteyin -> "İşaretçiler üyeleri olamaz" evet ama başlangıçta lambdaların operatörlere() derleyen sınıf türlerine (derleyiciler tarafından) dönüştürüldüğünü düşünmüştüm. Üye olabileceklerini düşündüm. Şimdi sizin deyiminiz "bu, dilin yerleşik unary' operatörünü + aritmetik tipler için kullanır ", eminim aritmetik tipler temel olarak integral + float türleridir, sonra nasıl ifade edilir ->' + []() '->' operator + (some_unknown_type_I_don 't_know) '-> void'e dönüştürülür (*)()' –

0

Peki, aşırı yükleyebilirsin, ne istersen onu yap, ama sadece simetri için tekil - operatörle. Bahsettiğiniz gibi, çoğu zaman bir no-op.

+3

? _operator sınıf argümanı olmalı mı yoksa numaralandırılmış tip_ sayılmalıdır. – Lol4t0

8

işaretçileri + SağDeğerler şeyler dönüm hariç noop olduğunu. Bu diziler çürümeye istiyorsanız bazen kullanışlı veya x bir int*&& değil bir int(&)[3] olduğunu Şimdi

int a[] = { 1, 2, 3 }; 
auto &&x = +a; 

çalışır. Şablonlara x veya +a geçmek istiyorsanız, bu fark önemli olabilir. a + 0 (o sizeof(forward_decl) * N bayt tarafından ilerler çünkü) bir işaretçi şey eklemeden işaretçi en-to sivri sınıf türü tamamen tanımlanmış olması gerekir, çünkü

struct forward_decl; 
extern forward_decl a[]; 
auto &&x = +a; // well-formed 
auto &&y = a + 0; // ill-formed 

son satırı kötü oluşur düşünün her zaman eşdeğer değildir.

+0

bu std :: move() 've' std :: forward() 'nin anlamı nedir? a 've' std :: move (a) 'aynı şeyi yapar mı? – LiKao

+1

@LiKao hiç değil.' move' türünü korur, ama sadece değer kategorisini değiştirir.Bu yüzden (a) 'yı hareket ettirir 'int [3]' türünü değil, int * 'türünde bir rıhtımı değil. Artık' move' işlevini bir işleve uygularken hiçbir şey yapmaz ('FunctionType & \' bir lvalue verir) ve özellikle anlamlı değildir. –

+0

@LiKao: Hayır, 'std :: move' diziyi korurken, unary + bozulur (ve bir rengin işaretçisini üretir) – Xeo

İlgili konular