SORU
29 Aralık 2012, CUMARTESİ


Neden C 11-silinmiş fonksiyonları aşırı yükleme çözünürlüğü katılıyor musunuz?

Neden C 11 "deleted" functions participate in overload resolution yapar mı?
Bu neden kullanışlıdır? Ya da başka bir deyişle, neden tamamen silinmek yerine saklandılar?

CEVAP
29 Aralık 2012, CUMARTESİ


= delete sözdizimi amacı yarısı belirli parametreleri ile belirli işlevleri çağırmak engellemek için mümkün olur. Bu, özellikle belirli bazı senaryolarda örtülü dönüşüm önlemektir. Özellikle aşırı yasak getirmek için, aşırı çözümleme katılmak için vardır.

Eğer alıntı cevap mükemmel bir örnek verir:

struct onlydouble {
  onlydouble(std::intmax_t) = delete;
  onlydouble(double);
};

Eğer delete işlevini tamamen kaldırıldı, o = delete sözdizimi bu eşdeğer olur:

struct onlydouble2 {
  onlydouble2(double);
};

Bunu yapmak için:

onlydouble2 val(20);

Bu yasal C . Derleyici tüm kurucular bakın; hiçbiri doğrudan bir tamsayı yazın. Ama bir tanesi örtülü bir dönüştürme işlemi sonrasında alabilir. Bu çağrı olacak.

onlydouble val(20);

Budeğilyasal C . Derleyici deleted olanlar da dahil olmak üzere tüm kurucular bak. Tam bir eşleşme std::intmax_t ile tam olarak herhangi bir tamsayı literal maç olacak) göreceksiniz. Derleyici deleted bir işlevi seçili çünkü seçin ve hemen hata verecek o zaman.

= delete" sadece "Bu yok." "bu yasaklıyorum demek Çok güçlü bir ifade.

C standardı = silmek anlamına gelir diyor neden sordum "bu yasaklıyorum" yerine "bu yok"

"Bu yok." demek için özel gramer ihtiyacımız yok çünkü. Bu örtülü olarak sadece "" söz konusu. bu özellikle bildirmek değil miyiz Bu yasaklıyorum "" bir yapı gösterirolamazözel dilbilgisi olmadan elde edilebilir. "Bu" değil de başka bir şey. yasaklıyorum demek için özel gramer bulduk ..

Tek işlevi "bu" dilbilgisi sonra varlığını ilan engellemek için olur. yoksa açık olmasından elde eder Ve kendi dilbilgisi ihtiyacı için sadece yararlı değil yeterince.

kopya yapıcı var olmadığını bildirmek için başka yol yoktur, ve varlığı anlamsız belirsizliklere neden olabilir.

Kopya kurucu üyesi özel bir işlevdir. Her sınıfher zamanbir kopya kurucu var. Onlar her zaman bir kopya atama operatör gibi, vb yapıcı hareket.

Bu işlevler var; soru hukuki onları aramak olsun. = delete yok anlamına geldiğini söylemek istedim eğer, o zaman belirtimi bir işlev mevcut değil için ne anlama geldiğini açıklamak zorunda kalacak. Bu şartname işleyen bir kavram değil.

Eğer tanımlı henüz ilan edilmemiş bir işlevi çağırmak için çalışırsanız, o zaman derleyici hata verecektir. Ama bir hata yüzündentanımsız bir tanımlayıcıdeğil , çünkü "işlev" hata varsa, derleyici bu şekilde bildirirse bile (). var olmayan bir Çeşitli kurucular aşırı çözümleme, "varoluş" bu bağlamda ele alınır. bu yüzden kendi tarafından tüm denir

Her durumda bir işlevi tanımlayıcı, ya da yapıcı/yıkıcı (tanımlayıcı, sadece tip-tanımlayıcı) ilan) ilan etti. Operatör yükleme sözdizimsel şeker arkasında tanımlayıcı gizler, ama hala orada.

C belirtim olamaz "varolmayan bir işlev." bir kavramı ele Aşırı bir uyumsuzluk işleyebilir. Aşırı bir belirsizlik işleyebilir. Ama ne yok biliyor değil mi. = delete çok daha yararlıdır "bu" "ben böyle yazdım." gibi daha az yararlı yerine başarısız arama girişimi açısından tanımlanır

Ve tekrar, tekrar okudum ilk bölümü. Sanayapamam"işlev mevcut değil." Bu da diğer sebep de bu yüzden bu şekilde tanımlanmış: çünkü bir ana kullanım durumlarda = delete sözdizimi yapabilmek için güç kullanıcı için kullanımı belirli parametre türleri, açık olarak döküm, ve benzeri. Temelde, örtülü tip dönüşümleri folyo için.

Öneriniz böyle bir şey yapmaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • michal lelkowski

    michal lelko

    9 Temmuz 2006
  • TheSalband Rai

    TheSalband R

    11 NİSAN 2011