C ++ unerwartetes Verhalten (wo sind meine Provisorien?)

Dies war ein R-Wert-Experiment, aber es mutierte, als gcc über das Fehlen eines Verschiebungskonstruktors jammerte (ich hatte es gelöscht) und nicht auf den Kopierkonstruktor zurückgriff (wie ich erwartet hatte), den ich dann entfernte C ++ 11 aus den Flags und versucht, was Sie unten sehen, es hat eine Menge Ausgabe (es hat nicht anfangs), weil ich versuche, herauszufinden, warum genau es nicht funktioniert (ich weiß, wie man debuggt, aber ich finde Nachrichten auf stdout (um ein guter Indikator für das Geschehen zu sein)

Hier ist mein Code:

#include <iostream>

class Object {
public:
    Object() { id=nextId; std::cout << "Creating object: "<<id<<"\n"; nextId++; }
    Object(const Object& from) {
         id=nextId; std::cout << "Creating object: "<<id<<"\n"; nextId++;
        std::cout<<"(Object: "<<id<<" created from Object: "<<from.id<<")\n";
    }
    Object& operator=(const Object& from) {
        std::cout<<"Assigning to "<<id<<" from "<<from.id<<"\n";
        return *this;
    }
    ~Object() { std::cout<<"Deconstructing object: "<<id<<"\n";}

private:
    static int nextId;
    int id;
};

int Object::nextId = 0;

Object test();

int main(int,char**) {
    Object a;
    std::cout<<"A ought to exist\n";
    Object b(test());
    std::cout<<"B ought to exist\n";
    Object c = test();
    std::cout<<"C ought to exist\n";
    return 0;
}


Object test() {
    std::cout<<"In test\n";
    Object tmp;
    std::cout<<"Test's tmp ought to exist\n";
    return tmp;
}

Ausgabe:

Creating object: 0
A ought to exist
In test
Creating object: 1
Test's tmp ought to exist
B ought to exist
In test
Creating object: 2
Test's tmp ought to exist
C ought to exist
Deconstructing object: 2
Deconstructing object: 1
Deconstructing object: 0

Ich verwende Dekonstruktion, weil Dekonstruktion schon ein Wort ist, manchmal verwende ich Destruktor, ich bin nie ganz glücklich mit dem Wort, ich bevorzuge Destruktor als Hauptwort.

Folgendes habe ich erwartet:

A to be constructed
tmp in test to be constructed, a temporary to be created from that 
    tmp, tmp to be destructed(?) 
that temporary to be the argument to B's copy constructor
the temporary to be destructed.
C's default constructor to be used
"" with a temporary from `test`
C's assignment operator to be used
the temporary to be destructed
c,b,a to be destructed.

Ich wurde "eingefleischtes C" genannt und ich versuche zu lernen, C ++ als mehr als "C mit Namespaces" zu verwenden.

Jemand könnte sagen "Der Compiler optimiert es heraus". Ich möchte, dass diese Person eine Frage niemals jetzt oder jemals mit einer solchen Antwort beantwortet. Optimierungen dürfen den Programmstatus nicht ändern, es muss seinals ob&nbsp;Alles geschah so, wie es in der Spezifikation angegeben ist. Der Compiler kann mich also mit einer Meldung unterhalten, die die Nummer enthält. Es ist möglicherweise nicht die Mühe wert, die Nummer und dergleichen zu erhöhen, aber die Ausgabe des Programms ist dieselbe wie in der Beschreibung Mach alles, was der Code beschreibt.

Es sind also keine Optimierungen, was ist los?