Если вы используете структурированные привязки, как так
auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s);
тогда копии из возвращенного кортежа будут удалены, а объекты будут отправлены прямо в a
, b
а также c
или инициализация будет конструкцией перемещения из отдельных элементов кортежа? Я сомневаюсь, что это приведет к тому, что произойдет копирование, но я не уверен, что описание обязательного копирования в стандарте обрабатывает этот случай.
Как покрыто этот отличный ответ, декларация эквивалентна:
auto e = std::make_tuple(1, 10.0, "string object"s);
int& a = get<0>(e);
double& b = get<1>(e);
std::string& c = get<2>(e);
кроме того, что нет имени e
, get
В этом контексте функция возвращает ссылку на lvalue на выбранный элемент.
В C ++ 17 auto name = prvalue;
определено объявить объект с именем name
типа decltype(prvalue)
инициализируется выражением prvalue — нет промежуточного временного объекта, который был бы допустим, как в предыдущих версиях.
Другими словами, e
объявление ведет себя точно так же, как:
std::tuple<int, double, std::string> e {1, 10.0, "string object"s};
а потом a,b,c
ссылки на элементы этого кортежа.
Примечание: приведенное выше объяснение соответствует последним черновым источникам C ++ 17; поведение может измениться, прежде чем C ++ 17 будет завершена, конечно.
Других решений пока нет …