Думаю, стоит сразу начать с кода:
#include <iostream>
class C
{
public:
C(int a);
~C();
C(const C &rhs);
C& operator=(const C &rhs);
C(C &&rhs);
C& operator=(C &&rhs);
int _a;
};
void func(C a)
{
std::cout << a._a << std::endl;
}
int main()
{
func(C{1});
std::cout << "Exit" << std::endl;
return 0;
}
В классе C реализованы все автоматически генерируемые методы (конструктор, деструктор, конструкторы и опрераторы присваивания для копирования и перемещения).
Вывод дебажной информации из методов показал, что для объектов, передаваемых в функцию func (первая строка функции main), вызываются только простые конструкторы.
Возможно, вопрос покажется глупым, но для меня это стало открытием. Почему же не вызывается никакая копирующая операция? Параметры, передаваемые в функцию func, просто "становятся" локальными параметрами самой функции. Действительно ли так было всегда или же это оптимизация современных компиляторов?
Если что, я использую GNU g++ 6.3.1 с поддержкой 11 и 14 стандартов.
bне несёт никакой смысловой нагрузки. – αλεχολυτ May 05 '17 at 08:16