可能な重複:
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は単なる古い参照です。