I have conflict in below codes.
#include <iostream>
using std::cout;
using std::endl;
class TestApp {
public:
    TestApp(int _x = 9) {
        cout << "default constructor\n";
    }
    TestApp(const TestApp &app) {
        cout << "Copy constructor\n";
    }
    ~TestApp() {
        cout << "destructor\n";
    }
    void setX(int _x) {
    }
    const TestApp &operator=(TestApp &obj) {
        cout << "= operator\n";
        return *this;
    }
    void setX(int _x) {
        cout << "Inside setX\n";
    }
};
int main() {
    TestApp app1;
    TestApp app2;
    TestApp app3;
    (app1 = app2) = app3; // 1
    app1 = app2 = app3; // 2
    app1.setX(3)
    return 0;
}
I got this error: for line 1 main.cpp:38: error: passing ‘const TestApp’ as ‘this’ argument of ‘const TestApp& TestApp::operator=(TestApp&)’ discards qualifiers
However I can use app1.setX(3);
main.cpp:38: error: no match for ‘operator=’ in ‘app1 = app2.TestApp::operator=(((TestApp&)(& app3)))’
main.cpp:28: note: candidates are: const TestApp& TestApp::operator=(TestApp&)
and to make it working I should make operator= like:
TestApp &operator=(const TestApp &obj) {
        cout << "= operator\n";
        return *this;
} // works for 1
TestApp &operator=(TestApp &obj) {
        cout << "= operator\n";
        return *this;
} // works for 2
why if I remove const keyword it works? and after line 1 app1 object is not constant.
 
     
    