Можливі дублікати:
постійні посилання на 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;
це робить foo посиланням на постійне виття. Ви можете подумати про це так:
(const wstring) & foo;
Коли ви робите typedef, ви фактично змінили пріоритет.
const RT foo;
const wstring & foo; // not equivalent, RT is a typedef, not a macro
const (wstring &) foo; // this is effectively what happens
Const робить foo const, а не те, на що посилається foo.
Звичайно, як зазначає FredOverflow, constпосилання є надмірним, оскільки ви не можете призначити посилання, лише об'єкту, на який він посилається. Таким чином, результат полягає в тому, що foo - це просто звичайна стара орієнтир.