/ / Utrata modyfikatora „const” [duplikat] - c ++

Utrata modyfikatora "const" [duplicate] - c ++

Możliwe duplikaty:
stałe odniesienia z typedef i szablonami w c ++

Proszę spojrzeć na następujący kod:

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;
}

Byłem zaskoczony, że argument „v” w funkcji „Zmień” można zmienić. Tracimy modyfikator „const”. Metafunkcje takie jak std :: add_const nie pomagają, czy mógłbyś wyjaśnić takie zachowanie?

Narzędzie: VS2010

Odpowiedzi:

4 dla odpowiedzi № 1

To rodzaj precedensu w wyrażeniu. Kiedy mówisz

const wstring & foo;

czyni foo odniesieniem do stałego sznurka. Możesz myśleć o tym w ten sposób:

(const wstring) & foo;

Kiedy tworzysz typedef, skutecznie zmieniłeś priorytet.

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

Stała tworzy foo const, a nie to, do czego odwołuje się foo.

Oczywiście, jak wskazuje FredOverflow, constreferencja jest redundantna, ponieważ nie można przypisać do referencji, tylko do obiektu, do którego się odwołuje. W rezultacie foo jest po prostu starym odniesieniem.