SORU
2 EYLÜL 2010, PERŞEMBE


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
2 EYLÜL 2010, PERŞEMBE


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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CareyHolzman

    CareyHolzman

    24 Ocak 2008
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011
  • Vintendo Power

    Vintendo Pow

    2 Ocak 2007