0
class Sample {
private:
    int         data = 0;
    std::string name = nullptr;

public:
    Sample(int m_data, const std::string& pName) : data(m_data), name(pName) {
        std::cout << "Sample(int, const std::string&): " << name << "\n";
    }

    Sample(const Sample& rhs) : data(rhs.data), name(rhs.name) {
        std::cout << "Sample(const Sample&): " << name << "\n";
    }

    ~Sample() {
        std::cout << "~Sample(): " << name << "\n";
    }
}

Sample TestFunc(int param) {
    Sample a(param, "a");

    return a;
}

I've made a class like this and called TestFunc(20); in main(). Then following output came out.

Sample(int, const std::string&): a
~Sample(): a

I expected that a temporary Sample object is made so copy constructor should be called, but it wasn't.

This code has compiled with GCC & Clang, and with MSVC, copy constructor is called as I expect.

Sample(int, const std::string&): a
Sample(const Sample&): a  // temporary object constructor
~Sample(): a
~Sample(): a  // temporary object destructor

What is the problem with GCC/Clang?

EnDelt64
  • 1,270
  • 3
  • 24
  • 31

0 Answers0