/ / Загубата на "const" модификатор [дубликат] - c ++

Загубата на "const" модификатор [дубликат] - c ++

Възможно дублиране:
постоянни препратки с typedef и шаблони в C ++

Моля, разгледайте следния код:

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

Бях изненадан, че аргументът "v" в функцията "Промяна" може да бъде променен. Ние губим "const" модификатор. Метафункции като std :: add_const не помагат, може ли да обясните такова поведение?

Инструмент: VS2010

Отговори:

4 за отговор № 1

Това е нещо като предимство в израз. Когато казваш

const wstring & foo;

тя прави за позоваване на постоянно wstring. Можете да го помислите така:

(const wstring) & foo;

Когато правите типеф, вие сте променили предимството.

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

Констът прави foo const, а не това, което foo препраща.

Разбира се, както отбелязва ФредОверт, констпрепратката е излишна, тъй като не може да се присвоява към препратка само към обекта, който тя препраща. Така че резултатът е, че foo е просто обикновен стар справочник.