Когда присвоение возвращаемого значения приводит к созданию копии?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Когда присвоение возвращаемого значения приводит к созданию копии?

Сообщение Anonymous »

В int main ниже есть шесть строк, в которых создается и инициализируется переменная; в каком из этих сценариев (если таковые имеются) создается копия для назначения?
Кроме того, в случае с SixthMap может ли произойти что-нибудь странное, поскольку мы используете автоматический вывод с амперсандом, но вызываемая функция также возвращает ссылку?

Код: Выделить всё

std::unordered_map
createStdObject()
{
std::unordered_map newUnorderedMap
{
{"A", {"first", "vector", "in", "map"},
{"B", {"second", "vector", "in", "map"}
};

return newUnorderedMap;
}

std::unordered_map&
createStdObjectWithReference()
{
std::unordered_map newUnorderedMap
{
{"A", {"first", "vector", "in", "map"},
{"B", {"second", "vector", "in", "map"}
};

return newUnorderedMap;
}

int main()
{
std::unordered_map firstMap = newUnorderedMap();
std::unordered_map secondMap = createStdObjectWithReference();

const auto thirdMap = newUnorderedMap();
const auto& fourthMap = newUnorderedMap();

const auto fifthMap = createStdObjectWithReference();
const auto& sixthMap = createStdObjectWithReference();

}

Основываясь на моих ограниченных знаниях, я бы предположил следующее:
  • Код: Выделить всё

    firstMap
    и ThirdMap могут быть копиями возвращаемого значения newUnorderedMap()
  • Все остальные приведут не к копиям, а к перемещению/ swap
  • Амперсанд в автоматическом объявлении SixthMap по сути будет игнорироваться, а SixthMap будет идентичен пятомуMap с точки зрения типа и поведения
С другой стороны, во время самой компиляции очевидно, что ни одно из возвращаемых значений на самом деле не нужно копировать, и поэтому я не вижу причин почему все они не должны приводить к назначению перемещения

Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-a-copy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»