SORU
11 AĞUSTOS 2014, PAZARTESİ


Farklı döküm operatörü farklı Derleyiciler tarafından çağrıldı

Aşağıdaki kısa C program göz önünde bulundurun:

#include <iostream>

class B {
public:
    operator bool() const {
        return false;
    }
};

class B2 : public B {
public:
    operator int() {
        return 5;
    }
};

int main() {
    B2 b;
    std::cout << std::boolalpha << (bool)b << std::endl;
}

Ben farklı Derleyiciler derleme, çeşitli sonuçlar alıyorum. Çınlama 3.4 ve GCC 4.4.7 ile Visual Studio 2013 true parmak izi (bool)b farklı döküm operatörleri diyorlar demek ki false,. Standardına göre doğru bir davranıştır?

Benim anlayış operator bool() operator int() derleyici ilk seçmeliyim yani int bool bir dönüşüm gerektirecek hiçbir dönüşüm ihtiyacı var. const O bir şeyler yapar, inş daha fazla "" derleyici? tarafından pahalı olarak kabul edilir

Ben const kaldırırsanız tüm Derleyiciler eşit çıktı false üretmek. Eğer iki sınıf birlikte birleştirip diğer taraftan, (hem operatörler aynı sınıfta olacak) üç Derleyiciler true çıkış üretecektir.

CEVAP
11 AĞUSTOS 2014, PAZARTESİ


Standart Birleşik Devletleri:

Bir dönüşüm türetilmiş bir sınıf işlevi, iki işlevi aynı tip dönüştürmek sürece, temel sınıftaki bir dönüştürme fonksiyonu gizlemez.

§12.3 [sınıf.dönş]

operator bool operator int tarafından gizli olduğu anlamına gelir.

Standart Birleşik Devletleri:

Aşırı çözümleme sırasında, dolaylı nesne değişkeni diğer değişkenler ayırt edilemez.

§13.3.3.1 [üzerinde.maç.funcs]

"Dolaylı nesne değişkeni" bu dava türü olan b, B2 &. operator bool derleyici b sabit operator bool çağrı eklemek olacak const B2 & gerektirir. Bu tüm diğer şeyler eşit olmak operator int daha iyi bir maç yapar.

Standart static_cast C-style cast bu durumda sahne olan) bir tür T (bu durumda int) dönüştürebilirsiniz Birleşik Devletleri:

25* *bildirimi iyi-oluşturulmuş, icat edilmiş bir geçici değişken t.

§5.2.9 [ifade.statik.cast]

int ** 28, ve bir dönüştürülebilir, bu nedenle bool eşit bool dönüştürülebilir.

Standart Birleşik Devletleri:

S ve onun temel sınıflar dönüştürme fonksiyonları olarak kabul edilir. S ve verim türü içinde gizli değil, açık seçik olmayan bu dönüştürme fonksiyonları 33**ya da standart bir dönüştürme sırası ile yazın T dönüştürülebilir bir türfonksiyon aday.

§13.3.1.5 [üzerinde.maç.dönş]

Aşırı seti operator int operator bool oluşur. Tüm diğer şeyler eşit olmak, operator int daha iyi bir maç constness eklemek zorunda değilsin. Bu nedenle operator int seçilmelidir.

Not (belki de karşı sezgi) standart değil düşünün dönüş türü (yani türü olan bu operatörler convert) bir kez onlar eklenmiştir aşırı seti (olarak kurulan yukarıda), sağlanan dönüşüm sırası için bağımsız bir tanesi öyle üstün dönüştürme sırası için bağımsız değişkenlerin diğer (hangi, nedeniyle constness, bu durumda bu örnek).

Standart Birleşik Devletleri:

Verilen bu tanımlar, geçerli bir fonksiyon F1 tanımlanmış bir işlevi daha iyi bir başka uygun bir işlev F2 için tüm argümanları ben, Müdahale(F1) değil daha kötü bir dönüşüm dizisi daha Müdahale(F2), ve sonra

  • bazı bağımsız değişkeni j, İCSj(F1) için değilse İCSj(F2) ya da, daha iyi bir dönüşüm sırası
  • bu bağlamda bir başlatma tarafından kullanıcı tanımlı dönüştürme ve standart dönüşüm sırası dönüş tipi F1 için hedef türü (yani, türünün varlık olmanın başlatıldı) daha iyi bir dönüşüm sıra daha standart dönüşüm sırası dönüş tipi F2 için hedef türü.

§13.3.3 [üzerinde.maç.en iyi]

Bu durumda, yalnızca bir bağımsız değişken (this örtülü parametre) vardır. * =^ *40 dönüşüm sırası. B2 & ( operator int aramak için) * =^ *43 üstündür. const B2 & ( operator bool aramak), ve bu nedenle operator int doğrudan bool aşırı yük aslında dönüştürmek değildir gerçeği göz önüne alınmaksızın kümesinden seçilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • Nick Pitera

    Nick Pitera

    8 NİSAN 2006
  • njhaley

    njhaley

    24 NİSAN 2006