3

このサンプル クラスhttp://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/sp_techniques.html#as_lockに出会い、構文に苦労しています。

class shared_lock
{

private:

    shared_ptr<void> pv;

public:

    template<class Mutex> explicit shared_lock(Mutex & m): pv((m.lock(), &m), mem_fn(&Mutex::unlock)) {}
};

この「(m.lock(), &m)」の部分を除いて、私はすべてを理解しています (信じています)。その全体が、スマート ポインターを初期化する最初のパラメーターのようです。その複合文は何に評価されますか? それは単にmのアドレスですか?ロックがパラメーター リストの一部としてそこに配置されているのはなぜですか (また、どのように有効なのですか)? 代わりに、次のようなステートメントを期待していました。

template<class Mutex> explicit shared_lock(Mutex & m): pv(&m, mem_fn(&Mutex::unlock)) {m.lock();}

私の代替ステートメントは機能を変更しますか?

4

1 に答える 1

2

その複合文は何に評価されますか? それは単にmのアドレスですか?

はい

ロックがパラメーター リストの一部としてそこに配置されているのはなぜですか (また、どのように有効なのですか)?

コンストラクターはロックを取得する必要があり、それを配置するのに便利な場所です。それ以外の場合は、共有ポインターをコンストラクターの本体に設定する必要があります。

コンマ演算子を含む式が初期化子で使用されるため、これは正当です。コンマ演算子とコンマ区切りパラメータのあいまいさを解消するために余分な括弧が必要ですが、それ以外の場合はほとんどすべての式が許可されます。

于 2012-06-27T19:28:23.453 に答える