2015-09-23 10 views
5

はcppcon2015でスライドから撮影しますか:: unique_ptrを

私はcppreferenceにおける仕様で参照してください。

typename std::add_lvalue_reference<T>::type operator*() const; 

質問:

  1. それは右辺値unique_ptrのためoperator*を禁止し、唯一の左辺値unique_ptrのための有効な間接参照を持っている意味をなすだろうか?
  2. 有効なユースケースが残っていますが、右辺値unique_ptrは逆参照できますか?このよう

//Make sure it is an lvalue. 
typename std::add_lvalue_reference<T>::type operator*() const &; 

注:私は、構文や正当性を確認していない、私は*このため右辺値参照と経験がありません。

+3

はなかった:これは、以下のユースケースが有効であり、かつoperator*が右辺値のために無効になっていた場合に可能ではないであろうように、unique_ptrが関連unique_ptr限り有効であるデリファレンスから取得したオブジェクトは、生きていることを意味します'f();の代わりに' * f(); 'を意味しますか? –

+0

btw。 'const&'は暗黙のオブジェクトがまだrvalueであることを許可します –

+1

問題を避けるために 'auto non_dangling = f()'はどうでしょうか?それは本当に修正が必要なポインタですか? –

答えて

3

私の質問は*thisの値を参照して解決できますか?

技術的にはい。

typename std::add_lvalue_reference<T>::type operator*() const&& = delete; 
//              ~~~~~~~~~~~~~~~^ 

とref-修飾子を追加することによって、既存のものを修正するために:一つの解決策は、右辺値用の追加(削除)過負荷を導入することであろう右辺値が強くなることを好むので

typename std::add_lvalue_reference<T>::type operator*() const&; 
//               ~~^~~ 

rvalue参照によって束縛されている場合、unique_ptrを含むrvalue式の参照を解除しようとすると、コンパイルエラー "削除された関数の使用"が発生します。

それは右辺値unique_ptrsためoperator*を禁止し、唯一の左辺値unique_ptrsのための有効な間接参照を持っている意味をなすだろうか?

必ずしもそうではありません。そのため、図書館はunique_ptr仕様に追加の制約を課すべきではないかと疑います。誤用を防ぐためです。

はまだ右辺値unique_ptr dereferenceableを維持するための有効な使用事例がありますか?

一時的なライフタイムは、その一時的な部分が完全な表現の最後に終わります。

(*f()).foo(); 
//   ^~~ unique_ptr is destroyed here 


use(*f()); 
//  ^~~ unique_ptr is destroyed here 
関連する問題