2014-01-23 4 views
0

Я видел это:Какие функции могут быть применены к rvalues?

std::tie(iter, inserted) = set_of_s.insert(value); 

из http://en.cppreference.com/w/cpp/utility/tuple/tie

std::tie должен возвращать RValue кортеж, но оператор присваивания затем применяется к нему. Как это работает? Я думал, что операторы присваивания могут применяться только к lvalue?

+1

По определению 'std :: tie' возвращает объект (даже не ссылаясь на него), который имеет' operator =() 'defined. И этот оператор вызывается. Как обычно. Где вы видите проблему? –

+0

@ c-smile Я просто очень смущен cuz opetator =() возвращает ссылку lvalue и нет нигде для ее возвращения ... – texasbruce

+0

Это ваше задание именно так: '{std :: tie temp (iter, вставлен); temp.operator = (set_of_s.вставки (значение)); } '. Как вы видите, это просто вызов функции для временного объекта, –

ответ

2

Какие функции могут быть применены к rvalues?

Rvalue может быть

  • передается в качестве this аргумента функции члена
  • передается по значению
  • принятого constименующего эталонного
  • принятого RValue ссылка.

Нельзя передавать неконстантно lvalue ссылка.

Как это работает?

Перегруженный оператор присваивания является функцией членом, так что может быть названо на RValue.

Я думал, что операторы присваивания могут применяться только к lvalue?

В этом случае со встроенными операторами присваивания. Перегруженные операторы являются функциями и выполняют те же правила, что и функции.

2

Да, встроенный оператор = должен иметь lvalue в качестве левого операнда. Однако это не встроенный оператор =, насколько он похож. Вместо того, чтобы это вызов функции operator= и эквивалентно: оператор доступа

std::tie(iter, inserted).operator=(set_of_s.insert(value)); 

члена класса . не нуждается в его левый операнде быть именующим выражение, так что все в порядке.

Примечание: не следует путать категорию значений выражений с типами значений lvalue/rvalue. Оператор присваивания вполне мог иметь имя ссылки rvalue в качестве его левого операнда, потому что выражение, которое является его именем, является lvalue.

+2

Это по определению * оператор '' = 'для этого типа. Это просто член типа, что и позволяет использовать это. –

+0

@ DavidRodríguez-dribeas Да, плохая фраза, я должен это исправить. –

+0

Но оператор присваивания возвращает ссылку lvalue. Откуда стоит lvalue? – texasbruce

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