2016-02-09 28 views
13

Wiem, że type of this jest wskaźnikiem prvalue ("czystej" rwartości) i że może on zostać zmieniony na wskaźnik na stały i/lub wskaźnik na zmienny (wpływając na dostęp do jego zmiennych instancji), dołączając słowa kluczowe: const lub volatile na końcu definicji funkcji, do której należy.Kiedy to ma znaczenie, że "to" jest wartością rowności?

Wiem również, że this jest czasami (nieprawidłowo) opisywany jako wskaźnik const, być może jako sposób na powiedzenie "nie można wykonać przypisania do this". Jako wartość, jest z natury nieprzylegalna, a więc nie ma potrzeby rutynowej koncepcji.

Wiem również, że w C++ 11 zdarzają się sytuacje, w których bycie rwartą lub lwartością może wpływać na rozstrzyganie połączeń, ale starałem się przezwyciężyć te możliwości i nie jestem pewien, czy istnieje przypadek gdzie byłoby naprawdę ważne, aby nazywać rozdzielczość, że this jest wskaźnikiem rvalue, a nie wskaźnikiem lvalue const.

Czy istnieje przypadek, gdy ta różnica sprawia, że ​​rzeczywisty wpływ, z punktu widzenia programisty, takich jak kontekst gdzie rvalue wskaźnik może być wykorzystany że const lwartość wskaźnik nie może być używany, gdzie const lwartość wskaźnik może być wykorzystany że wskaźnik rurnue nie może, lub gdzie różnica wpływa na rozdzielczość połączenia?

Odpowiedz

6

Oczywistym skutkiem, że this jest prvalue, jest niezgodne z ustawą &this. Zatem wbudowany operator jednoargumentowy & tworzy przykład "gdzie można użyć wskaźnika const value, którego wskaźnik rvalue nie może". Z tego samego podstawowego powodu bezpośrednie wiązanie odniesień do this nie jest możliwe.

Również prvalue-ności od this oznacza, że ​​sama this nie może być const lub volatile, ponieważ skalarne rvalues ​​nie może mieć rodzaje CV kwalifikacje.

Prawdopodobnie trudno jest zbudować nieuczciwe przykłady kodu rzeczywistego w oparciu o te rozróżnienia.

+1

Inna konsekwencja polega na tym, że przechwycenie 'this' w lambda jest specjalnym przypadkiem językowym (ponieważ zwykle można przechwytywać tylko wartości średnie) –

+0

Mam rację mówiąc, że" ponieważ "i to jest nielegalne, nie możemy również przekazać tego" 'do funkcji, która przyjmuje referencję rwartości? Czy wystarczyłoby to, aby udowodnić, że na rozstrzygnięcie połączenia połączenia przechodzącego przez "to" nie może mieć wpływu jego status rwartości? Lub może coś takiego jak [blokowanie przekazywania wartości rvalues ​​jako argumenty] (http://stackoverflow.com/questions/6307526/c0x-const-rvalue-reference-as-function-parameter) nadal stosuje się do 'this'? –