/ / 'const'修飾子を失う[複製] - c ++

'const'修飾子の紛失[duplicate] - c ++

可能な重複:
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;
}

"Change"関数の引数 "v"を変更できることに驚きました。 "const"修飾子を失います。 std :: add_constのようなメタファンクションは役に立ちません、あなたはそのような振る舞いを説明してもらえますか?

ツール:VS2010

回答:

回答№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が参照するものではなく、fooをconstにします。

もちろん、FredOverflowが指摘するように、constは参照には代入できず、参照先のオブジェクトにしか代入できないため、参照は冗長です。その結果、fooは単なる古い参照です。