Структурированные привязки и обязательное копирование

Если вы используете структурированные привязки, как так

auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s);

тогда копии из возвращенного кортежа будут удалены, а объекты будут отправлены прямо в a, b а также c или инициализация будет конструкцией перемещения из отдельных элементов кортежа? Я сомневаюсь, что это приведет к тому, что произойдет копирование, но я не уверен, что описание обязательного копирования в стандарте обрабатывает этот случай.

3

Решение

Как покрыто этот отличный ответ, декларация эквивалентна:

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 будет завершена, конечно.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]