/ / Втрата модифікатора '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;

це робить 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 - це просто звичайна стара орієнтир.