2017-01-21 6 views
3

Если вы используете структурированные привязки, как такСтруктурированных привязки и обязательный экземпляр Пропуск

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

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

+0

«Будут ли скопированы копии из возвращенного кортежа, и объекты идут прямо в a, b и c« Нет », будут ли инициализации перемещать конструкции из отдельных элементов кортежа« Нет. – cpplearner

+0

@cpplearner, то они скопированы? – Curious

ответ

4

Как охватывается this excellent answer, объявление эквивалентно:

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 для выбранного элемента.

В С ++ 17, auto name = prvalue;is defined, чтобы объявить объект называется name типа decltype(prvalue) инициализирован с prvalue выражением - нет никакого промежуточного временного который был elidable, как и в предыдущих вариантах.

Другими словами, e декларация ведет себя точно так же, как:

std::tuple<int, double, std::string> e {1, 10.0, "string object"s}; 

, а затем a,b,c ссылки на элементы этого кортежа.


Примечание: приведенное выше описание соответствует последним источникам проекта C++ 17; поведение может измениться, прежде чем C++ 17 будет завершен, конечно.

+0

В этом примере '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' вызывается в эквиваленте 'std :: move (e)'. –

+0

@ T.C. 'e' является lvalue, поэтому' get (e) 'должна быть версия, которая принимает значение lvalue и возвращает ссылку lvalue? (Но даже если вы правы, конечный результат будет таким же, поскольку a, b, c также являются lvalues). [dcl.decomp/3] в настоящее время говорит: «В противном случае инициализатор« get (e) '» –

+1

Формулировка здесь довольно сложная. Ключевое предложение: «В любом случае« e »является значением lvalue, если тип объекта' e' является ссылкой lvalue и значением xvalue иначе ». –

 Смежные вопросы

  • Нет связанных вопросов^_^