の種類は、以下のコードを検討してください。この場合ラムダ式、共有ポインタこの
auto foo() {
// In this case, there is no explicit cast
// The type of ptr is no longer std::shared_ptr<T>
// It is std::shared_ptr<S> instead
auto ptr = shared_from_this();
return [ptr](){ return ptr->bar(); };
}
もはやコンパイル(いずれもGCCでも打ち鳴らすとともに)コード、:それは次のようにメソッドfoo
が変更されていない場合。
明らかに、最初の例で行ったことはキャスト後にコンパイルされますが、この場合でもラムダではbar
が見えることが予想されます。そのコンテキストおよびインターフェイスの一部で到達可能ですS
も同様である。
私は特に、それは5.1.5p8によるものであることを疑う:
ラムダ式の化合物のステートメントは、関数体[...]関数呼び出し演算子の収率が、[用.. 。]、のタイプと値を決定するこの [...]、複合ステートメントは、ラムダ式のコンテキストで考慮されます。実際に
は、打ち鳴らすによって返されるエラーは非常に明確である:
main.cppに:8:9:注意:唯一のタイプのオブジェクトにこのメンバーにアクセスすることができる
T
私の控除権はありますか?
これは、前述の段落のために、共有ポインタの1つと一致しないthis
ポインタの型の決定に問題がありますか?
shared_ptr
がゲームに参加するということは、私が理解するのが少し難しくなります。
正直なところ、両方のサンプルがコンパイルされるか、両方が失敗すると思います。
あなたの 'static_pointer_cast'は消えました。また、 'return [ptr = shared_from_this()](){return ptr-> bar();を実行します。 }; 'は違った振る舞いをしますか? – ildjarn
'shared_from_this'は' S'の共有ポインタを返します。これはもはや 'T'のものにキャストされません。したがって、実際には 'ptr'の型は' std :: shared_ptr
'です。私はもっと読みやすい方法でそれを書いてほしいですか? – skypjack[Works for me](http://melpon.org/wandbox/permlink/hl00GHSN4JZ1Qhi1)をいくつかの簡単な変更の後に追加します。 –