С ++ неожиданное поведение (где мои временники !?)

Это был эксперимент с r-значением, но он мутировал, когда gcc пожаловался мне на отсутствие конструктора перемещения (я его удалил) и не обратился к конструктору копирования (как я и ожидал). Затем я удалил -std = C ++ 11 из флагов и попробовал то, что вы видите ниже, у него много выходных данных (изначально не было), потому что я пытаюсь понять, почему именно это не работает (я знаю, как отлаживать, но я нахожу сообщения на stdout должны быть хорошим индикатором того, что происходит)

Вот мой код:

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

Выход:

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

Я использую деконструкцию, потому что деконструкция - это уже слово, иногда я использую деструктор, я никогда не очень доволен этим словом, я предпочитаю деструктор как существительное.

Вот что я ожидал:

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.

Меня назвали «несгибаемый C», и я пытаюсь научиться использовать C ++ больше, чем «C с пространствами имен».

Кто-то может сказать: «Компилятор оптимизирует его». Я бы хотел, чтобы этот человек никогда не отвечал на вопрос с таким ответом сейчас или когда-либо, оптимизация не должна изменять состояние программы, это должно бытьбудто все произошло так, как сказано в спецификации, поэтому компилятор может меня утешить, поместив сообщение на cout, содержащее число, возможно, даже не увеличит число и тому подобное, но вывод программы будет таким же, как если бы он это сделал делать все, что описано в коде.

Так что это не оптимизация, что происходит?

Ответы на вопрос(0)

Ваш ответ на вопрос