Hi everyone.

In C++, we can pass an object of the same type by value to the constructor of the class, which results in a copy of the same type or its subtype being required. 
    
The sequence of constructor calls can be greatly optimized by disabling copying of the same type or its subtypes before constructing  an object. I'm confused why C++ doesn't disable it.
    
That is, when we are going to do something(constructing an object via some constructor), the prerequisite is that we need to do something of the same kind. For example,  the derived(int i, derived that) and template <typename T> base(T x) in the code snippet below.

struct base {

  base() {}

  template <typename T> base(T x) {}

};

struct derived : public base {

  derived(){}

  derived(int i, derived that): base(that) {}

  derived(derived& that): base(that) {}

};

int main() {

  derived d1;

  derived d2(d1);

  return 0;

}