1

可能重复:
C++ 中带有 typedef 和模板的常量引用

请看下面的代码:

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 回答 1

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

const 使 foo 成为 const,而不是 foo 引用的内容。

当然,正如 FredOverflow 指出的那样,const 引用是多余的,因为您不能分配给引用,只能分配给它引用的对象。所以结果是 foo 只是一个普通的旧参考。

于 2012-04-24T16:35:47.143 回答