2013-05-14 9 views
17

std :: refの仕組みを理解しようとしています。上記のコードでreference_wrapperとstd :: refはどのように機能しますか?

#include <functional> 
#include <iostream> 

template <class C> 
void func(C c){ 
    c += 1; 
} 

int main(){ 
    int x{3}; 
    std::cout << x << std::endl; 
    func(x); 
    std::cout << x << std::endl; 
    func(std::ref(x)); 
    std::cout << x << std::endl; 
} 

Output : 3 3 4 

、私は第三の関数呼び出しのためのテンプレートパラメータCstd::reference_wrapper<int>としてインスタンス化されると思います。 the referenceを読んでいるうちに が見つかりました+=の演算子がstd::reference_wrapper<int>に見つかりませんでした。 次に、c += 1;はどのように有効ですか?

答えて

18

c += 1;はどのように有効ですか?

reference_wrapper<int>は、変換演算子を介してint&に暗黙的に変換可能であるからです。オペランド・タイプ自体に適切なオーバーロードがない場合、オペランドに対して暗黙的な変換が考慮されます。

+0

次に、cはまだreference_wrapper です。 – Sungmin

+0

@Sungmin:実際、 'c'自体は型を変更できません。 '+ ='は 'c.operator int&()'の結果に適用され、 'reference_wrapper'のターゲットへの参照になります。 –

+0

ありがとう、私は理解しています。 – Sungmin

12

std::reference_wrapper<T>は、conversion operator~T&を有する。つまり、例ではstd :: reference_wrapperを暗黙的にint&に変換することができます。

+0

2つの答えがほぼ同時にアップロードされました。しかし、マイクシーモアの答えは少し速いです。それとは別に、私はどちらを選ぶかを決めることができません。そのために残念。とにかくありがとう。 – Sungmin

+1

@スンミンあなたは大歓迎です。とにかくSeymourの答えはとにかく優れていると私は思っています。彼はオペレータの過負荷とオペランドについて説明します。 – juanchopanza

関連する問題