Neden std::eşitlik karşılaştırılabilir işlevi değil mi?
Bu soru da boost::function
std::tr1::function
için geçerlidir.
std::function
eşitlik karşılaştırılabilir değildir:
#include <functional>
void foo() { }
int main() {
std::function<void()> f(foo), g(foo);
bool are_equal(f == g); // Error: f and g are not equality comparable
}
C 11, operator==
operator!=
aşırı sadece diye bir şey yok. C 11 tasarısında, aşırı yorum (N3092 §20.8.14.2) ile silinmiş olarak ilan edildi:
// deleted overloads close possible hole in the type system
Tür sistemi "Olası delik". ne demek yok TR1 ve güç olarak, aşırı ama tanımlanmamış ilan etti. TR1 belirtimi yorumlar (N1836 §3.7.2.6):
Bu üye fonksiyonlar tanımsız kalacaktır.
[Not:boolean-dönüşüm iki fonksiyon örneği
==
!=
ile mukayese edilebilir sayede bir boşluk açar.void
Bu tanımsız operatörleri deliği kapatacak ve derleme zamanı hatası olun.—son not]
Bu benim anlayış "kaçamak" bool
dönüştürme fonksiyonu varsa, bu dönüşüm eşitlik karşılaştırmalarda kullanılabilecek (ve diğer koşullar):
struct S {
operator bool() { return false; }
};
int main() {
S a, b;
bool are_equal(a == b); // Uses operator bool on a and b! Oh no!
}
C 03 kasa-bool deyim ve C 11'de açık bir dönüşüm işlevi bu "kaçamak." önlemek için kullanıldığını sanıyordum Ve her ikisi de function
C ve 11 kasa-bool deyim kullanımını artırmak TR1 bool
dönüştürme fonksiyonu açık hale getirir.
Her ikisi de olan bir sınıfın bir örneği olarak, std::shared_ptr
bool
dönüşüm açık bir işlevi vardır ve eşitlik karşılaştırılabilir.
Neden std::function
eşitlik karşılaştırılabilir mi? "Type sisteminde delik?" ne mümkün Nasıl std::shared_ptr
benden ne farkı var?
CEVAP
Neden
std::function
eşitlik karşılaştırılabilir mi?
std::function
bir anlamda keyfi için çağrılabilir türleri, bu yüzden sipariş için uygulamak eşitlik karşılaştırma hiç ... bilemiyorum gerektiren tüm sermaye türlerini eşitlik-comparible, yerleştirerek bir yük herkes uygulayan bir işlevi nesne. O zaman bile, eşdeğer işlevleri (örneğin bağlayıcı) bağımsız değişkenler tarafından inşa edildi eşitsiz eğer farklı bir sırayla karşılaştırmak gibi eşitlik dar bir kavram almak istiyorum. İmkansız genel durumda eşdeğerlik test olduğuna inanıyorum.
"Type sisteminde delik?" ne mümkün
Ben sanırım bu şekilde daha kolay silmek operatörleri, ve emin bunu kullanarak onları asla geçerli bir kod verin, daha kanıtlamak için hiçbir yolu yok mu? istenmeyen örtülü dönüşüm meydana gelen bazıları daha önce keşfedilmemiş köşe durumda.
Nasıl
std::shared_ptr
benden ne farkı var?
std::shared_ptr
iyi tanımlanmış bir eşitlik mantığı vardır; iki işaretçiler eğer ikisi de boş, ya da her ikisi de boş olmayan ve aynı nesneye işaret eden varsa da sadece eşittir.
Neden't java değil.lang.Sayı uygu...
Neden't GCC*****a (**)*(**) optim...
Neden' ◎ܫ◎ ve fonksiyonu t JavaSc...
Neden boyutu(x ) x artım değil mi?...
Neden Java statik olarak bir sınıf bil...