Сначала я прокомментирую третий:
Foo obj3=Foo(args);
Он не использует operator=
, который называется назначением копирования. Вместо этого он вызывает конструктор копирования (теоретически). Здесь нет назначения. Таким образом, теоретически, существует два объекта создания, один временный и другой obj3
. Компилятор может оптимизировать код, полностью исключая создание временного объекта.
Теперь второй:
Foo obj2; //one object creation
obj = Foo(args); //a temporary object creation on the RHS
Здесь в первой строке создается объект, вызывающий конструктор по умолчанию. Затем он вызывает operator=
, передавая временный объект, созданный из выражения Foo(args)
. Таким образом, есть два объекта, только operator=
принимает аргумент по ссылке const
(что он и должен делать).
А в отношении первого вы правы.