SORU
14 Kasım 2008, Cuma


Dönüş türü işlev imzası bir parçası mı?

C , dönüş türü işlev imzası bir parçası olarak kabul edilir? ve aşırı yükleme sadece dönüş değiştirilmiş türü izin verilir.

CEVAP
14 Kasım 2008, Cuma


Normal fonksiyonlarını imza karşılığında türü vardır.

(notbu cevabı tekrar yazdım, ve yorumlar aşağıda bu revizyon - ayrıntılar için Düzenle-tarih) geçerli değil.

Giriş

Ancak, Standart fonksiyonlar ve fonksiyon bildirimleri hakkında sorun karmaşık. Dikkate alınması gereken iki katmanı vardır:

  • Bildirimleri
  • Varlıkları

Sözdebildirim fonksiyonuMayıs işlevi bir varlık ya da şablon bir varlık bildirin. Eğer işlev bir varlık ilan edip, sonra da bir işlev şablonu tüm argümanlar (belirtilmiş), ya da sıradan bir işlev bildiriminin açık bir uzmanlaşma ile ne ilgisi var. Eğer şablon bir varlık bildirilirse, o zaman birincil işlevi bir şablon, ya da bazı argümanlar belirtilen yerde açık bir ihtisas beyan ediyorsunuz. (Bu "beyan" ve nesneleri veya Kaynaklar: eski bir nesne ya da bir referans ya. beyan edebilir nesne ilişkisi çok benzer Bu yüzden birbildirim nesnesinesneyi bildirmek şart değil!).

Standart 1.3.10 şunlar için bir işlev imzası tanımlar:

Onun parametre türleri ve işlevi sınıfın bir üyesi ise, işlevi cv - elemeleri (varsa) kendisi ve üye işlev sınıfı bildirildi. İşlev bir şablonu uzmanlaşma imza şablon bağımsız değişken türleri içerir. (14.5.5.1)

Bu tanım içinde dönüş türü eksikişlev bir şablonu uzmanlaşma imza bölümü (i.e bir fonksiyon ilan eder bir fonksiyonu olan bir uzmanlık bir şablon) olarak belirttiği tarafından 14.5.5.1 (son C 0 x çalışma kağıtları sabit zaten söz dönüş türü 1.3.10):

İşlev bir şablonu uzmanlaşma imza gerçek şablon bağımsız değişken işlev şablon imza ve açıkça belirlenmiş ya da çıkarılabilir olsun) oluşur.

İşlevi bir şablon işlevi, imza, imza, dönüş tipi ve şablon parametre listesi oluşur.

Tam olarak bir imza, bir daha ne içerir?

Bir imza rica ediyoruzişlevibiz iki cevap vermek zorunda:

  • İşlev şablonları uzmanlık işlevleri için imza dönüş türü içerir.
  • Uzmanlık işlevler için, dönüş türü imzasının bir parçası değildir.

Dikkat edin, ancak, dönüş türü, herhangi bir durumda, bubir fonksiyon türü önemli bir parçası. Bu, aşağıdaki geçerli değildir

void f();
int (*pf)() = &f; // different types!

Ne zaman yalnızca dönüş türü farklıysa aşırı geçersiz mi?

Büyük Derleyiciler şu anda aşağıdaki kodu reddetmek:

int f();
double f(); // invalid

Ama aşağıdaki kodu kabul:

template<typename T> int f();
template<typename T> double f(); // invalid?

AncakStandart yalnızca dönüş türü içinde farklı bir işlev bildirimi korusunaşırı geçerli olduğunda, ve ne zaman değil tanımlarken (). "Sadece dönüş Türüne göre değişir" anlamına gelir, ama. tam olarak tanımlamıyor


Standart paragraf referanslar:

  • Ne zaman bir işlev bildirimi aşırı yüklenmiş olabilir: 13.1
  • Ne işlev bildirimi: 7/2 7/5
  • Ne işlev şablonu/bir uzmanlık imza: 14.5.5.1

En son C 0x taslak n3000 diyor ki "işletmelerin farklı türde kapsama çok daha kapsamlı olan 1.3.11,:. imza başvurusu için

bir fonksiyonu olarak, üyesi olduğu sınıf veya ad ve parametre tip listesi (8.3.5). Eğer fonksiyonu veya işlevi bir şablon sınıfının bir üyesi ise onun imzası ayrıca işlevi veya işlev şablonu kendisini cv-yeterlik (varsa) ve ref-niteleyici (varsa) içerir. İşlevi şablon imza ayrıca döndürme türü ve şablon parametre listesi içerir. İşlev bir şablonu uzmanlaşma imzası olan bir uzmanlık ve bağımsız değişkenleri şablon bu şablon, imza, açıkça belirtilmiş veya çıkarılabilir mi) içerir. [ Not: İmza ad değiştirme için bir temel olarak kullanılan ve bağlama. — son not ]

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Juan Carlos Candela Bordera

    Juan Carlos

    4 Mart 2009
  • Louis C.K.

    Louis C.K.

    18 HAZİRAN 2006
  • Matt Harding

    Matt Harding

    23 Mayıs 2006