For learning purpose I was doing following exercise.
#include <iostream>
class DEMO
{
  public:
  DEMO(const DEMO& d)
  {
    std::cout << ">> [COPIED]" << std::endl;
    data = d.data;
  }
  DEMO(DEMO&& d)
  {
    std::cout << ">> [MOVED]" << std::endl;
    data = d.data;
  }
  DEMO(int i)
  {
    std::cout << ">> [DEFAULT]" << std::endl;
    data = i;
  }
  DEMO& operator=(const DEMO& d)
  {
      if(this != &d)
      {
        std::cout << ">> [ASSIGNED]" << std::endl;
        data = d.data;
      }
      return *this;
  }
  int data;
};
DEMO&& d1()
{
  return DEMO(44);
}
const DEMO& d2()
{
  return DEMO(66);
}
DEMO d3()
{
  return DEMO(55);
}
int main() 
{
  std::cout << "CASE 1" << std::endl;
  DEMO a1 = d1();
  std::cout << "CASE 2" << std::endl;
  DEMO a2 = d2();
  std::cout << "CASE 3" << std::endl;
  DEMO a3 = d3();
  std::cout << "CASE 4" << std::endl;
  DEMO a4(33);
  std::cout << "CASE 5" << std::endl;
  DEMO a5 = a4;  
  std::cout << "CASE 6" << std::endl;
  DEMO a6 = std::move(a4);  
  return 0;
}
OUTPUT
CASE 1
>> [DEFAULT]
>> [MOVED]
CASE 2
>> [DEFAULT]
>> [COPIED]
CASE 3
>> [DEFAULT]
CASE 4
>> [DEFAULT]
CASE 5
>> [COPIED]
CASE 6
>> [MOVED]
I don't understand what happened at case 3. Only one default constructor call ? I was expecting either copy or move constructor call. Can anyone explain what happened here.
Object a3 get proper value 55 from d3(). So it seems it copied properly.
 
    