Copiar construtores e operadores de atribuição

Eu escrevi o seguinte programa para testar quando o construtor de cópia é chamado e quando o operador de atribuição é chamado:


#include 

class Test
{
public:
    Test() :
        iItem (0)
    {
        std::cout << "This is the default ctor" << std::endl;
    }

    Test (const Test& t) :
        iItem (t.iItem)

    {
        std::cout << "This is the copy ctor" << std::endl;
    }

    ~Test()
    {
        std::cout << "This is the dtor" << std::endl;
    }

    const Test& operator=(const Test& t)
    {
        iItem = t.iItem;    
        std::cout << "This is the assignment operator" << std::endl;
        return *this;
    }

private:
    int iItem;
};

int main()
{
    {
        Test t1;
        Test t2 = t1;
    }
    {
        Test t1;
        Test t2 (t1);
    }
    {
        Test t1;
        Test t2;
        t2 = t1;
    }
}

Isso resulta na seguinte saída (acabou de adicionar linhas empy para torná-lo mais compreensível):

doronw@DW01:~$ ./test
This is the default ctor
This is the copy ctor
This is the dtor
This is the dtor

This is the default ctor
This is the copy ctor
This is the dtor
This is the dtor

This is the default ctor
This is the default ctor
This is the assignment operator
This is the dtor
This is the dtor


O segundo e terceiro conjunto se comportam como esperado, mas no primeiro conjunto o construtor de cópia é chamado mesmo que o operador de atribuição seja usado.

É este comportamento parte do padrão C ++ ou apenas uma otimização inteligente do compilador (estou usando o gcc 4.4.1)

questionAnswers(3)

yourAnswerToTheQuestion