C ++ comportamento inesperado (onde estão meus provisórios !?)

Este foi um experimento de valor r, mas sofreu mutação quando o gcc reclamou para mim sobre a falta de construtor de movimento (eu o excluí) e não retornou ao construtor de cópia (como eu esperava) e então removi -std = c ++ 11 das bandeiras e tentei o que você vê abaixo, ele tem um monte de saída (não inicialmente), porque eu estou tentando descobrir por que exatamente ele não funciona (eu sei como depurar, mas acho mensagens no stdout para ser um bom indicador de algo acontecendo)

Aqui está meu código:

#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;
}

Saída:

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

Eu uso a desconstrução, porque a desconstrução já é uma palavra, às vezes eu uso o destruidor, eu nunca fico feliz com a palavra, eu prefiro o destrutor como o substantivo.

Aqui está o que eu esperava:

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.

Eu tenho sido chamado de "die-hard C" e estou tentando aprender a usar o C ++ como mais de "C com namespaces".

Alguém pode dizer "o compilador otimiza isso" Eu gostaria que essa pessoa nunca respondesse uma pergunta com essa resposta agora ou nunca, otimizações não devem alterar o estado do programa, deve serAté parece&nbsp;tudo aconteceu como a especificação diz, então o compilador pode me dar um bom humor colocando uma mensagem no cout que inclua o número, ele pode não se incomodar em aumentar o número e tal, mas a saída do programa seria a mesma que se tivesse faça tudo o que o código descreve.

Então não são otimizações, o que está acontecendo?