Есть ли возможная ситуация, когда value () && имеет значение по сравнению с std :: move и value ()?
Рассмотрим следующее:
optional<A> func() {...}
void f(optional<A> opt) {...}
void g(A a) {...}
f(func());
g(func().value());
Параметр
f
opt
будет инициализирован при перемещении. Технически, он будет инициализирован непосредственно значением prvalue, но предварительный C ++ 17 означает, что он инициализируется при перемещении. Эта инициализация может быть исключена, но если это не так, то это делается с помощью перемещения. Всегда.
А как насчет параметра g
? Что должно произойти? Хорошо, рассмотрим, что это будет делать:
struct C {string s;};
C func2() {...}
void h(string s);
h(func2().s);
Параметр h
инициализируется с помощью move . Зачем? Потому что, если вы обращаетесь к подобъекту члена prvalue, полученное выражение будет xvalue и, следовательно, может перемещаться без явного использования std::move
.
Конструктор &&
optional
гарантирует, что value
работает так же. Если вы вызываете его для временного значения prvalue, он возвращает значение xvalue, которое можно перемещать без явного вызова std::move
. Таким образом, в исходном случае параметр g
инициализируется перемещением, точно так же, как если бы он обращался к подобъекту-члену типа prvalue.