Warum wird der Kopierkonstruktor hier nicht aufgerufen?

Für den folgenden Code:

    #include<iostream>
    using namespace std;

    class Test
    {
    public:
       Test(const Test &t) { cout<<"Copy constructor called"<<endl;}
       Test()        { cout<<"Constructor called"<<endl;}
    };

    Test fun()
    {
        cout << "fun() Called\n";
        Test t;
        return t;
    }

    int main()
    {
        Test t1;
        Test t2 = fun();
        return 0;
    }

Ich bin wirklich verwirrt, wann der Kopierkonstruktor aufgerufen wird. Wie wenn ich das obige Programm ausführe, wird der Kopierkonstruktor nicht aufgerufen. Das heißt, wenn ich die Parameter, die an den Kopierkonstruktor übergeben wurden, durcheinander bringe (das Schlüsselwort const wird entfernt), sollte kein Compilerfehler angezeigt werden. Aber es zeigt

msgstr "Keine passende Funktion für den Aufruf von 'Test :: Test (Test)'"

Darüber hinaus gibt fun () ein Objekt vom Typ test zurück, das während der Ausführung von fun () erstellt wird. Warum wird der Kopierkonstruktor hier nicht aufgerufen?

    int main()
    {
        fun();
        return 0;
    }

auch wenn ich folgende Änderungen an der Hauptfunktion vornehme, warum wird der Kopierkonstruktor nur einmal aufgerufen, nicht zweimal?

    int main()
    {
        Test t2 = fun();
        Test t3 = t2;
        return 0;
    }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage