Life time of temporary objects last until the full length of the expression in which it was created when used without references.
Consider the following:
 class My
 {
   int i;
   public:
     void increment()
     {
       i++;
     }
 };
 My withOutConst()
 {
   return My();
 }
 const My withConst()
 {
   return My();
 }
 int main()
 {
   My ob;
   withOutConst().increment();  // Case 1
   withConst().increment();     // Case 2
   return 0;
 }
As I understand the compiler creates a temporary object( of type const My) to hold the return value in the above cases.
And, I am trying to modify the temporary object.
(1) Compiles fine and 
(2) Results in a compile time error with the error: 
error: passing 'const My' as 'this' argument of void My::increment() discards qualifiers
That means basically this is of type My and not const My as it is called for a non-const function.
My question:
I am trying to modify a temporary object of type const My by calling a non-const member function. 
Then why don't I get the same error in case(1) because I am operating over an object of the type     const My in both the cases. 
I understand that this is related to the return type of the functions but am unable to fully comprehend because at the end it boils down to the function(void My::increment()) which is trying to modify temporaries of type const My in both the cases.