2012-02-05 19 views
21

ローポインタの代わりにstd::reference_wrapperをテンプレートパラメータとして使用した場合のメリットは何ですか?それは私が実際の参照が私を作るラップするヌル忘れやポインタの構文を使用する必要がありませんが、種類の冗長性(すなわちvector<reference_wrapper<MyClass> >)を加えた呼び出しサイトの利用はstdを持つ:: refの好きstd::vector<std::reference_wrapper<MyClass> >std::vector<MyClass*>容器内の未加工のポインタの代わりにreference_wrapperを使用する利点はありますか?

ですそれが価値がないと思う。

私はstd :: shared_ptrまたは他のスマートポインタを使用することがオプションではない場合を参照しています。

reference_wrapperやその他の要因を考慮していないのですか? (私の質問は、C++ 11のreference_wrapperとboostの両方に当てはまると思う)

+5

IMOでは、無限の参照が大きな利点であり、冗長性を上回ることがよくあります。しかし、これは単に熟練した人の意見です。 – kkm

+0

@kkmこの引数はまだ[not_null](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#i12-declare-a-pointer-that-must-not-be-null)で保持されます。 -as-not_null)ポインタ? – Woofas

+0

@Woofas:多分そうではありません。私は最新の言語の提案にあまり精通していません。これは、whoppin '3日間されている! :) – kkm

答えて

18

私はあるとは思わない技術的な違い参照ラッパーは、ターゲットを動的に変更する機能を含む、基本的なポインター機能を提供します。

利点は、それが意図を示すことです。それは、 "誰でも"変数を持っているというコードを読んでいる人に、実際にそのライフスパンをコントロールしていないことを伝えます。ユーザーは削除や新しいものを忘れていません。ポインタのセマンティクスを見ている人もいます。

+1

結果 - 参照/ ref_wrappersは、構文がポインタよりも優れているにもかかわらず、オブジェクトのライフタイムの問題を防ぎません。 – mskfisher

+0

はい、それは本当にすべての意図です。私は参照が非nullポインタであることを追加します。 'std :: vector 'はnullptrを持っているかもしれませんが、参照のベクトルを反復するとき、それらのすべてが有効であるとわかっています。 –

0

テンプレートを使って作業している間は、リファレンスは実際には問題があります。あなたは(何らかの理由で)働くだろうコードに問題がある可能性がありますテンプレートパラメータとして参照してコードをコンパイルするのに十分な「幸運」であれば、次のように:

template<class T> f(T x) { g(x); } 
template<class T> g(T x) { x++; } 

を次に、あなたはそれがg<int>を呼び出しますf<int&>(x)を呼び出す場合でも、 。しかし、reference_wrapperはテンプレートでうまく動作します。

前述のように、vector<int&>のようなコンパイルでは問題が発生しますが、vector<reference_wrapper<int>>はうまく動作します。

+0

"それで' f (x) 'を呼んでも' g 'が呼び出されます。"ええ、これは、あなたが引数を 'f()'に転送参照として渡していないので、それを 'g()'に 'std :: forward'したからだと思います。あなたがそれをしたら、あなたはこの仕事をすることができると思います。そうであれば、コーディングが言語を「本当に問題に」させないステップを欠いている。 ;-) –

関連する問題