2013-06-09 13 views
16

boostに付属の構造の一部をいつ使用するのが適切かを理解しようとしており、boost::optionalの使用に関する質問がありました。boost :: optional vs T *

私はboost::optionalを使用して、次のクラスがあるとします。そのgetHelpernullを返すことができ、すなわち、彼らの両方が、同じ意図を伝える

class MyClass { 
public: 
    MyClass() : helper(nullptr) {} 

    initialise(Helper& helper) { 
     this->helper = &helper; 
    } 

    Helper* getHelper() { 
     return helper; 
    } 

private: 
    Helper* helper; 
} 

class MyClass { 
public: 
    MyClass() {} 

    initialise(Helper& helper) { 
     this->helper = helper; 
    } 

    boost::optional<Helper&> getHelper() { 
     return helper; 
    } 

private: 
    boost::optional<Helper&> helper; 
} 

は、なぜ私は上記の代わりに使用します、呼び出し元はヘルパーが返されたかどうかをテストする必要があります。

'値'、nullptrと '値ではない'の違いを知る必要がある場合は、boost::optionalを使用するだけですか?

+0

boost :: optional T *のラッパー。 boost :: optionalよりT *を優先してください。はboost :: optionalのためにはC++で変です。 T *はわかりやすいです – jean

答えて

18

オプションポインタは、(1)ポインタ演算が使用されていないこと、(2)参照先の所有権が他の場所で保持されていることを示唆している可能性があります(したがってdeleteは変数では明白に使用されません)。

+1

うーん、それは意味があると思います。ありがとう。 – Lee

+7

現代のC++では、未加工のポインタは所有権が他の場所で維持されていることをすでに示唆しているはずです。 –

17

偉大な質問と、上記のJohn Zwinckの答えは正しいです。しかし、多くの人々(例えば、標準化委員会の多く)は、optional<T&>がそのような紛らわしい意味を持つことができる場合、これらの理由がoptional<T&>の存在を正当化するのに十分であるかどうか疑問に思う。これらの人の1人に割り当てるときに何が起こるべきかを検討してください。参照を再配置する(すなわち、別のオブジェクトを指すようにする)か、参照を介して割り当てるか、実際のT&のようにするか?いずれかの場合は、混乱と微妙なバグを引き起こす可能性があります。 optional<T&>のサポートは、最近C++ 14で承認されたproposalから削除されました。

つまり、あなたのコードをC++ 14のstd::optionalに移植したい場合は、T*boost::optional<T&>よりも優先してください。

関連する問題