/ / Perdita del modificatore 'const' [duplicato] - c ++

Perdita del modificatore 'const' [duplicato] - c ++

Possibile duplicato:
riferimenti costanti con typedef e template in c ++

Si prega di guardare il seguente codice:

typedef wstring& RT;
RT Change(const RT v)
{
v += L"234"; // why can I change this argument???

return v;
}

int _tmain(int argc, _TCHAR* argv[])
{
wstring str = L"111";
wstring &str2 = Change(str);

return 0;
}

Sono rimasto sorpreso dal fatto che l'argomento "v" nella funzione "Modifica" possa essere modificato. Perdiamo il modificatore "const". Metafunzioni come std :: add_const non aiutano, potresti spiegare questo comportamento?

Strumento: VS2010

risposte:

4 per risposta № 1

È una specie di precedenza in un'espressione. Quando dici

const wstring & foo;

fa riferimento a una costante tensione. Puoi pensarlo in questo modo:

(const wstring) & foo;

Quando crei un typedef, hai effettivamente cambiato la precedenza.

const RT foo;
const wstring & foo;  // not equivalent, RT is a typedef, not a macro
const (wstring &) foo;  // this is effectively what happens

La const rende il foo const, non ciò a cui fa riferimento il foo.

Naturalmente, come sottolinea FredOverflow, una constil riferimento è ridondante, poiché non è possibile assegnare a un riferimento, solo all'oggetto a cui fa riferimento. Quindi il risultato è che foo è solo un semplice riferimento.