2012-04-24 3 views
1

Можно создать дубликат:
constant references with typedef and templates in 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

+0

Я не согласен с «точной копией». Ответ по существу тот же, но другой вопрос подразумевает, что шаблоны являются частью проблемы, когда все это сводится к типизации. По этой причине эта версия вопроса может принести больше пользы для поиска людей. –

ответ

4

Это вроде как старшинства в выражении. Когда вы говорите

const wstring & foo; 

это делает foo ссылкой на константу wstring. Вы можете думать об этом так:

(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 

Состоит из foo const, а не того, что ссылается на foo.

Конечно, как указывает FredOverflow, ссылка на const является избыточной, поскольку вы не можете назначить ссылку только для объекта, к которому он ссылается. Таким образом, результат состоит в том, что foo - просто простая старая ссылка.

+0

Я почти уверен, что 'const' просто игнорируется в последней строке, потому что нет такой вещи, как ссылка' const'. – fredoverflow

Смежные вопросы