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
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ınT
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.
Mod operatörü (%) farklı farklı bir so...
Neden bir MD5 kabuk Python bir yankı k...
Sütunlar farklı ayarlar olduğunda satı...
Postgresql TARAFINDAN farklı SİPARİŞ i...
Farklı tarayıcılarda bir URL uzunluğu ...