Today I encountered something I don't really understand about copy constructor.
Consider the next code:
#include <iostream>
using namespace std;
class some_class {
  public:
    some_class() {
    }
    some_class(const some_class&) {
      cout << "copy!" << endl;
    }
    some_class call() {
      cout << "is called" << endl;
      return *this;  // <-- should call the copy constructor
    }
};
some_class create() {
  return some_class();
}
static some_class origin;
static some_class copy = origin; // <-- should call the copy constructor
int main(void)
{
  return 0;
}
then the copy constructor is called when assigning origin to copy, which makes sense. However, if I change the declaration of copy into
static some_class copy = some_class();
it isn't called. Even when I am using the create() function, it does not call the copy constructor. 
However, when changing it to
static some_class copy = some_class().call();
it does call the copy constructor. Some research explained that the compiler is allowed to optimize the copy-constructor out, which sound like a good thing. Until the copy-constructor is non-default, as then it might, or might not do something obvious, right? So when is it allowed for the compiler to optimize out the copy-constructor?
 
    