Farklı döküm operatörü farklı Derleyiciler tarafından çağrıldı | Netgez.com
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

  • ★ByScrapi★ Designs

    ★ByScrapiâ

    27 AÄžUSTOS 2013
  • captainpuppys2000

    captainpuppy

    20 HAZÄ°RAN 2013
  • Glyn Dewis

    Glyn Dewis

    25 AÄžUSTOS 2007