На этом сайте есть много вопросов о оптимизации возвращаемого значения (я полагаю, это довольно запутанная тема), но я не могу найти ответ, который отвечает на мой конкретный вопрос. Если у меня есть код, который выглядит так:
returnType function() { stuff....}
void someOtherFunction()
{
returnType var = function();
more stuff...
}
Мне сказали, что компилятор может решить не использовать два экземпляра returnType
в someOtherFunction()
. Логически, я ожидал бы, что function()
будет генерировать объект типа returnType
, а someOtherFunction()
получит это значение через конструктор копирования (перегруженный или нет) во временное значение. Тогда я ожидал, что временное значение, которое будет скопировано с помощью присваивания (которое может быть перегружено и теоретически может иметь любую функциональность!) В var
, которое ранее было бы инициализировано с помощью конструктора по умолчанию.
Я вижу здесь потенциальную проблему. Что произойдет, если эта временная копия returnType
в someOtherFunction()
отсутствует? Не нужно ли var
заполнять через конструктор копирования возвращаемое значение из function()
напрямую? Если это так, не будет ли вызов оператора назначения никогда не называться? Если это так, и если оператор присваивания перегружен, не может ли это изменить функциональность программы? Если это так, означает ли это, что ответственность программиста за то, чтобы =
всегда выполняла то же самое, что и конструктор копирования? И мне не нравится запускать эту длинную цепочку вопросов, но если да, то почему С++ позволяет вам определять конструкторы копирования для выполнения чего-то другого, кроме назначения?