2012-02-21 59 views
7

Zastanawiam się nad zastąpieniem wszystkich wystąpień bezpiecznego idola boolem przez explicit operator bool w kodzie, który już używa funkcji C++ 11 (więc fakt, że starsze kompilatory nie rozpoznają jawnej konwersji operatorzy nie będą mieli znaczenia), więc chciałbym się dowiedzieć, czy może to powodować pewne subtelne problemy.Niekompatybilność między bezpiecznym idiomem bool a jawnym bool operatora

Zatem jakie są wszystkie ewentualne niezgodności (nawet najdrobniejsze z nich), które mogą być spowodowane przez przejście od starego i nudny bezpieczne bool idiom do nowego i błyszczące explicit operator bool?

EDYCJA: Wiem, że przełączanie jest dobrym pomysłem, ponieważ jest to funkcja językowa, dobrze zrozumiała przez kompilator, więc nie będzie działać gorzej niż to, co jest w rzeczywistości tylko hack. Po prostu chcę poznać możliwe różnice.

Odpowiedz

3

Jeśli w kodzie użyto nieprawidłowej konwersji bezpiecznej, tylko wtedy explicit operator bool będzie niekompatybilna, ponieważ nie pozwala na łatwe wykonanie nieprawidłowych czynności. W przeciwnym razie powinno być dobrze bez problemu. W rzeczywistości, nawet jeśli jest problem, powinieneś przełączyć się na explicit operator bool, ponieważ jeśli to zrobisz, możesz zidentyfikować problem w korzystaniu z konwersji safe-bool.

Według this article niektóre kompilatory emitują nieefektywnych instrukcje dotyczące realizacji bezpieczne bool za pomocą wskaźnika funkcji członek,

Kiedy ludzie zaczęli używać tego idiomu, okazało się, że istnieje kara wydajność w niektórych kompilatorów - w wskaźnik funkcji członka spowodował ból głowy kompilatora, powodując wolniejsze wykonanie po pobraniu adresu. Chociaż różnica jest marginalna, obecną praktyką jest zazwyczaj użycie wskaźnika danych elementu zamiast wskaźnika funkcji elementu.

+0

Oczywiście masz rację. Ale jest powód, dla którego oznaczyłem to słowem "język-prawnik". Chciałbym uzyskać czyste fakty, które wynikają z samego standardu, a nie porady na temat dobrych praktyk. Muszę to wyjaśnić, ale dzięki. – Fanael

+0

@Fanael: Oba standardy, C++ 03 i C++ 11, nie mówią o idiomie safe-bool, więc nie można cytować z niego, aby poprzeć to, co powiedziałem. Domyślam się tylko, że C++ 11 wprowadził "wyraźny operator bool" dla przyczyn i jednym z powodów, jak sądzę, jest "wyraźny operator bool" jest ** bezpieczniejszy ** niż tzw. idiom bezpieczny. – Nawaz

+1

Ale standard mówi o rzeczach używanych do implementacji idiomu "safe-bool". Tak więc, chociaż standard nic nie mówi o tym idiomie, jego dokładne gwarancje są w znacznym stopniu zasugerowane w dokumencie. – Fanael

4

Prawdopodobnie największa różnica, zakładając swój kod jest wolny od błędów (wiem, nie jest to bezpieczne założenie), będzie to, że w niektórych przypadkach, może chcesz niejawna konwersja dokładnie bool. Funkcja konwersji explicit nie będzie pasować.

struct S1 
{ 
    operator S1*() { return 0; } /* I know, not the best possible type */ 
} s1; 

struct S2 
{ 
    explicit operator bool() { return false; } 
} s2; 

void f() 
{ 
    bool b1 = s1; /* okay */ 
    bool b2 = s2; /* not okay */ 
} 
+2

To nie jest idiom bezpieczny. – Nawaz

+4

Już zauważyłem, że użyty wskaźnik typu I nie jest najlepszym możliwym typem, dobrze służy jako przykład, ponieważ różnice między tym a poprawną implementacją są nieistotne dla mojej odpowiedzi, a to jest bardziej czytelne. – hvd