В добавлении к JaredPar ответ
1-обычный ctor, 2nd-function-like-ctor с временным объектом.
Скомпилируйте этот источник где-нибудь здесь http://melpon.org/wandbox/ с различными компиляторами
// turn off rvo for clang, gcc with '-fno-elide-constructors'
#include <stdio.h>
class Thing {
public:
Thing(const char*){puts(__FUNCTION__ );}
Thing(const Thing&){puts(__FUNCTION__ );}
~Thing(){puts(__FUNCTION__);}
};
int main(int /*argc*/, const char** /*argv*/) {
Thing myThing = Thing("asdf");
}
И вы увидите результат.
Из ИСО / МЭК 14882 2003-10-15
8,5, часть 12
Ваша 1-я, 2-я конструкция называется прямой инициализацией
12,1, часть 13
Функциональное преобразование типа записи (5.2.3) может использоваться для создания
новые объекты своего типа. [Примечание: синтаксис выглядит как явный вызов
конструктора. ] ... Объект, созданный таким образом, не имеет названия.
[Примечание: 12.2 описывает время жизни временных объектов. ] [Заметка:
явные вызовы конструктора не дают lvalues, см. 3.10. ]
Где почитать про RVO:
12 Специальные функции-члены / 12.8 Копирование объектов класса / Часть 15
При соблюдении определенных критериев реализация может быть опущена
конструкция копии объекта класса, даже , если конструктор копирования
и / или деструктор для объекта имеет побочных эффектов .
Отключите его с флагом компилятора из комментария, чтобы просмотреть такое поведение копирования)