2016-11-06 9 views
1

は考えてみましょう:C++ STLスタック:(ポップすることが安全である)

#include <iostream> 
#include <stack> 

class Abc { 
    int x = 5; 
    public: 
    void display() { 
     std::cout << x << std::endl; 
    } 
}; 

int main() { 
    std::stack<Abc> S; 
    S.emplace(); 

    auto obj = S.top(); 
    S.pop(); 
    obj.display(); 
    return 0; 
} 

から:http://www.cplusplus.com/reference/stack/stack/pop/、 "これは削除要素のデストラクタを呼び出します"。 また、http://www.cplusplus.com/reference/stack/stack/top/から、stack.top()は参照によって戻されます。

S.top()が参照によって返され、S.pop()がオブジェクトを破壊した場合、なぜobj.display()に失敗しますか?

スタックは、基本コンテナのback()pop_back()のメソッドを呼び出すことがわかりました。拡張によって、なぜそれは失敗しないのですか?

答えて

6

auto obj = S.top();コピー初期化objからS.top()までです。それは、次に削除された要素のコピーです。

あなたのコードスニペットの動作は明確です。

あなたが参照を取るとしたら私の最後の発言が言うようにそれは、j4nu5 @auto& obj = S.top();

+0

のように、定義されません。要素は破壊された後で参照され使用されるので、それは基本的な動作ではありません – StoryTeller

関連する問題