Я пытаюсь узнать об управлении ресурсами в C ++, и в моих исследованиях я столкнулся с интересной оптимизацией. По сути, при инициализации объекта в стеке с помощью конструктора копирования, где этот объект является объектом rvalue (это rvalue?), Вместо вызова конструктора и последующего вызова конструктора перемещения, компилятор просто вызывает конструктор исходного объекта.
Object c(Object(1)); // This is the same as Object c(1);
Object c(Object(Object(Object(Object(Object(1)))))); // This is also the same as Object c(1);
Expected flow:
1. Object(1) calls the constructor and creates a nameless Object that will be removed as soon as it's created.
2. c notices this is an rvalue, and calls the move constructor.
3. Destructor for Object(1) is called.
Actual flow:
1. c(1) is called.
Это умно, но .. Как? Какой механизм стоит за этим трюком? Это работает, даже если конструктор для Object принимает указатели и множество аргументов.