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;
}

「Change」関数の引数「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 が参照するものではなく、foo を const にします。

もちろん、FredOverflow が指摘しているように、const 参照は冗長です。参照に割り当てることはできず、参照するオブジェクトにのみ割り当てることができるからです。その結果、foo は単純な古い参照にすぎません。

于 2012-04-24T16:35:47.143 に答える