2013-06-17 12 views
25

W W this wskaźnik [class.this], C++ standardowe stanowi:Jeśli `this` nie jest const, dlaczego nie mogę go zmodyfikować?

Typ this w funkcji składowej klasę X jest .

tj. this nie jest const. Ale dlaczego to jest wtedy

struct M { 
    M() { this = new M; } 
}; 

daje

error: invalid lvalue in assignment <-- gcc 
'=' : left operand must be l-value <-- VC++ 
'=' : left operand must be l-value <-- clang++ 
'=' : left operand must be l-value <-- ICC 
(source: some online compiler frontends) 

Innymi słowy, this nie const, ale to naprawdę jest!

+7

słowo kluczowe "this" nie jest zmienną, dlatego nie możemy stwierdzić, że jest stałe lub nie. –

+0

nawet gdyby to działało, skonstruowałbyś tylko nieskończoną pętlę. –

+0

@vlad_tepesch: Albo to, albo nieskończona rekurencja (jak można to zrobić w pythonie). To jednak nie było pytanie. –

Odpowiedz

45

Ponieważ w tym samym akapicie wspomniano również, że this jest ("czysta wartość").

Przykłady wymienione w normie dla czystej wartości są wynikiem wywołania funkcji, która nie zwraca referencji, lub literałów takich jak 1, true lub 3.5f. this -pointer nie jest zmienną, bardziej przypomina literał, który rozszerza się na adres obiektu, dla którego funkcja ta nazywa się ([class.this]). I np. dosłowne true ma typ bool i niebool const, this jest typu i nieX*const.

+3

@busy_wait W C++ wartości mają kategorię * * i * *. * Typ 'this' to' X * ', a jego kategorią wartości jest prvalue. Jak to jest nieodwołalne? "this" musi być prvalue ("i to" nie ma sensu) - po co tworzyć jego typ "X * const", gdy jest już niemodyfikowalne? – Angew

+3

@Angew: Trzeba dodać, że istnieją języki, w których "to" (lub jego odpowiednik) nie jest niemodyfikowalne. Na przykład. python: 'class X: def __init __ (self): self = X() s = X()' <- Zapewni to 'przekroczenie maksymalnej głębokości przekopu ', a nie błąd kompilacji. –

+0

Tak jasne i zwięzłe +1. Rozumiem C++ więcej teraz :) (głównie wyjaśnienie czystych wartości r). –

Powiązane problemy