2013-06-17 11 views
25

In I this puntatore [class.this], il C++ stati standard:Se `this` non è const, perché non posso modificarlo?

Il tipo di this in una funzione membro di una classe X è .

, ovvero this non è const. Ma perché è allora che

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

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) 

In altre parole, non è thisconst, ma è davvero!

+7

parola chiave "questo" non è una variabile, quindi non possiamo affermare che sia costante o no. –

+0

anche se funzionasse, hai solo costruito un ciclo infinito. –

+0

@vlad_tepesch: o quella o ricorsione infinita (come si può fare in python). Questa non era la domanda, però. –

risposta

45

Perché nello stesso paragrafo, si dice anche che this è un prvalue ("valore puro").

Esempi menzionati nello standard per valore puro sono il risultato di chiamare una funzione che non restituisce un riferimento o valori letterali come 1, true o 3.5f. Il parametro this non è una variabile, è più simile a un valore letterale che si espande all'indirizzo dell'oggetto per cui la funzione è denominata ([class.this]). E come per es. letterale true ha tipo bool e nonbool const, this è di tipo e nonX*const.

+3

@busy_wait In C++, i valori hanno una categoria * di tipo * e una *. * Il tipo di 'this' è' X * ', la sua categoria di valore è il valore di prvalore. Come è questo non-definitivo? 'this' deve essere un valore di prvalue (' e questo 'non ha senso) - perché rendere il suo tipo 'X * const' quando è già immodificabile? – Angew

+3

@Angew: Si dovrebbe aggiungere che ci sono linguaggi in cui "questo" (o il suo equivalente) non è non modificabile. Per esempio. python: 'classe X: def __init __ (self): self = X() s = X()' <- Questo darà una 'profondità massima di ricusione superata 'e non un errore di compilazione. –

+0

Così chiaro e conciso +1. Capisco più C++ ora :) (principalmente la spiegazione dei rvalori puri). –

Problemi correlati