У додаток до відповіді JaredPar
1-звичайний ctor, 2-х функціональний-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");
}
І ви побачите результат.
Від ISO / IEC 14882 2003-10-15
8.5, частина 12
Ваша 1-я, 2-я конструкція називається прямою ініціалізацією
12.1, частина 13
Перетворення типу функціональних позначень (5.2.3) може використовуватися для створення нових об'єктів такого типу. [Примітка: Синтаксис виглядає як явний виклик конструктора. ] ... Об'єкт, створений таким чином, не називається. [Примітка: 12.2 описується термін експлуатації тимчасових об'єктів. ] [Примітка: явні виклики конструктора не дають значення, див. 3.10. ]
Де читати про RVO:
12 Спеціальні функції членів / 12.8 Копіювання об'єктів класу / Частина 15
Коли певні критерії виконуються, реалізація допускається опускати конструкцію копії об’єкта класу, навіть якщо конструктор копії та / або деструктор для об'єкта мають побічні ефекти .
Вимкніть його з прапорцем компілятора з коментаря, щоб переглянути таке поведінку копіювання)