負け

2012-04-24 2 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

私は「正確な重複」に同意しません。答えは本質的に同じですが、もう1つの質問は、テンプレートがすべてtypedefingになったときに問題の一部であることを意味します。その理由から、このバージョンの質問は、人々の検索に多くの利益をもたらすかもしれません。 –

答えて

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は単純な古いリファレンスに過ぎません。

+0

'const'参照のようなものがないので、最後の行で' const'が単に無視されることは確かです。 – fredoverflow

関連する問題