2016-05-03 11 views
11

私はQScopedPointerのコードを読んでいて、私が理解できなかったことに出くわしました。QScopedPointerの演算子RestrictedBoolの目的は何ですか?

ここcode.qt.io上QScopedPointerから適切なコードは次のとおりです。

template <typename T, typename Cleanup = QScopedPointerDeleter<T> > 
class QScopedPointer 
{ 
    typedef T *QScopedPointer:: *RestrictedBool; 
public: 
... 
#if defined(Q_QDOC) 
    inline operator bool() const 
    { 
     return isNull() ? Q_NULLPTR : &QScopedPointer::d; 
    } 
#else 
    inline operator RestrictedBool() const 
    { 
     return isNull() ? Q_NULLPTR : &QScopedPointer::d; 
    } 
#endif 
... 
inline bool isNull() const 
{ 
    return !d; 
} 
... 
protected: 
    T *d; 

私はのQDocがQScopedPointeroperator boolの代わりoperator RestrictedBoolを持っていると思わせるプリプロセッサの定義を理解しています。どのような目的でRestrictedBoolが役立つのかわかりません。例えば、単純な実装は次のとおりです。要するに

inline operator bool() const 
{ 
    return !isNull(); 
} 

ここで何が起こっていますか? operator RestrictedBooldのアドレスを手戻りしているのはなぜですか。operator boolの代わりに最初に存在するのはなぜですか?

+5

に私はなりそれが '明示的オペレータbool'のQt方法であると言います(pre C++ 11)。 – Jarod42

+2

明示的な変換に限定されています – user463035818

+2

[this](http://lists.qt-project.org/pipermail/development/2012-January/001433.html)は、[this](http://www.artima .com/cppsource/safebool。html) – user463035818

答えて

9

これは、セーフブールIdiomの実装であり、hereと説明されています。

ナイーブな実装:

inline operator bool() const 
{ 
    return !isNull(); 
} 

は例えば、暗黙的に他の操作のために使用することができるboolの右辺値を返します

QScopedPointer<Foo> foo(nullptr); 
int i = 1; 
if (foo < i) 
    ... 

は有効なコードです。

概要:RestrictedBooldの型へのポインタのプライベートtypedefです。これを演算子の戻り値の型として使用すると、if文(if (foo))で使用できますが、他の演算子では使用できません。

注:C++11 allows the use of explicit operator boolは、C++ 11以降のコードでSafe Bool Idiomを使用する必要がありません。 C++ 11でQScopedPointerの実装は次のようになります。

explicit operator bool() const 
{ 
    return !isNull(); 
} 

この回答のための基礎を提供するためのtobi303とJarod42をお願い致します。

C++ 11と安全なブールイディオムに関するさらなる読書:

+1

こんにちは、https://codereview.qt-project.org/#/c/158069/のようなことを言ったのですか? :-) – peppe

+0

私は間違って明示的なboolが 'if(foo)'をまだ許可していると仮定していますか? –

+0

よろしいですか。私は '明示的な演算子bool'がどのように動作するかについてはっきりと読んでおく必要があるので、C++ 11の参考文献を引用しなかった。 –

関連する問題