January 22, 2013

disable kelime anlamı olarak devre dışı anlamına geliyor. '@disable' ile imlenen bildirimlere başvurarak derleme zamanı hataya neden olur. disallow niteliği işlemlerde ve yüklemelerde çalışma zamanı üretilen hataya değil derleme zamanında üretilen hataya güvenildiğinde kullanılmalı.

Yani '@disable' ile işaretlenenler kullanılamıyor. Kullanılırsa derleme zamanı hata veriyor. Ancak yinede @disable ile kullanılan her şey söz dizimine uygun olmalı.

Yani daha tamamlamadığımız işlevlerde filan kullanmak için sanırım. Benim anladığım bu :-)

Örn:

struct T {
 @disable this(this) {} // devre dışı bırakılarak T'yı kopyalanamaz yaptı
}

struct S {
 T t;   // Kopyalanamaz üyesi S'yi ayrıca kopyalanamaz yapar.
}

@disable int a;
@disable void foo() { }

void main() {
 S s;
 if(a==a)  // hata, a devredışı
 S t = s;  // hata, S kopyalanamaz
 foo();   // hata, foo devredışı
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 22, 2013

Ben bu ihtiyacı C++'tan biliyorum. Bazı türlerin nesnelerinin kopyalanmaları olanaksız veya anlamsız olabilir. Öyle durumlarda C++03'te uygulanan yöntem, kopyalayıcıyı ve atama işlecini private olarak bildirmek ama hiç tanımlamamaktır. (Biz de boost::noncopyable'ı kullanarak bu işi biraz daha otomatik hale getiriyoruz.)

C++11 bu ihtiyacı daha temiz biçimde karşılamak için '= delete' söz dizimini getirdi:

http://en.wikipedia.org/wiki/C%2B%2B11#Explicitly_defaulted_and_deleted_special_member_functions

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]