std::queue::pop が値を返さないのはなぜですか? 質問する

std::queue::pop が値を返さないのはなぜですか? 質問する

私はこれを経験しましたページしかし、その理由は分かりません。そこには次のように書かれています。

「値をまったく返さず、クライアントに front() を使用してキューの先頭の値を検査するように要求する方が合理的です」

しかし、front()から要素を検査するには、その要素をlvalueにコピーする必要もあります。たとえば、このコードセグメントでは

std::queue<int> myqueue;
int myint;
int result;
std::cin >> myint;
myqueue.push (myint);
/* here temporary will be created on RHS which will be assigned to
   result, and in case if returns by reference then result will be
   rendered invalid after pop operation */
result = myqueue.front();  //result.
std::cout << ' ' << result;
myqueue.pop();

5行目カウントオブジェクトは最初に myqueue.front() のコピーを作成し、それを result に割り当てます。それで、違いは何でしょうか。pop 関数でも同じことができます。

ベストアンサー1

それで、違いは何でしょうか。pop 関数でも同じことができます。

確かに同じことを行うこともできます。そうしなかった理由は、ポップされた要素を返すポップは、例外が存在する場合には安全ではないためです (値を返す必要があるため、コピーが作成されます)。

次のシナリオを考えてみましょう (私の主張を説明するために、単純で架空の POP 実装を使用)。

template<class T>
class queue {
    T* elements;
    std::size_t top_position;
    // stuff here
    T pop()
    {
        auto x = elements[top_position];
        // TODO: call destructor for elements[top_position] here
        --top_position;  // alter queue state here
        return x;        // calls T(const T&) which may throw
    }

T のコピー コンストラクターが戻り時に例外をスローする場合、キューの状態は既に変更されており (top_position私の単純な実装では)、要素はキューから削除されます (返されません)。すべての意図と目的において (クライアント コードで例外をキャッチする方法に関係なく)、キューの先頭の要素は失われます。

この実装は、ポップされた値が必要ない場合にも非効率的です (つまり、誰も使用しない要素のコピーを作成します)。

void popこれは、2 つの別々の操作 (および)を使用して、安全かつ効率的に実装できますconst T& front()

おすすめ記事