Я читаю C ++ Reference статью о категориях значений , пытаясь лучше понять, какие выражения на самом деле могут быть значениями xval и что мотивирует отличия от prvalues и lvalues.
У меня естьнекоторые вопросы по этим примерам, поэтому я расскажу один за другим:
вызов функции или перегруженное выражение оператора, тип возвращаемого значения которого равен rvalue, например, std::move(x)
Это, пожалуй, самый распространенный случай, и я думаю, что в основном это понимаю. По сути, это преобразование в &&T
(явное преобразование рассматривается ниже) и используется для того, чтобы в конечном итоге принудительно использовать перегруженный конструктор и присваивание перемещения, которые заботятся о фактическом перемещении .
Мой вопрос здесь: это единственный вариант использования для std::move
? Кроме того, зачем мне объявлять что-то как int &&a = std::move(42);
?
a[n]
, встроенное выражение нижнего индекса, где один операнд является массивом rvalue
Ok,здесь я полностью потерян: что такое массив rvalue и в чем разница между ним и массивом lvalue (упомянутым выше в примерах lvalues)?
Я предполагаю, что формулировка один операнд относится к этой синтаксической странности C / C ++: a[n] == n[a]
.
a.m
, член выражения объекта, где a
является rvalue, а m
является нестатическим элементом данных не ссылочного типа
Итак, если a
является выражением, которое оказывается rvalue, то a.m
являетсяxvalue при условии, что m
удовлетворяет некоторым условиям.
Например:
struct A { int m = 0; };
A a() { return A{}; }
Тогда a().m
является значением xvalue. Это правильно?
a.*mp
, указатель на член выражения объекта, где a - это значение r, а mp - указатель на член данных
Это возможнотак же, как и в предыдущем примере, за исключением использования функции «указатель на элемент». Это правильно?
a ? b : c
, троичное условное выражение для некоторых b
и c
Отредактировано
Это мне кажется интересным: почему категория не относится к тому же типу, что и b
или c
?
приведенное выражение для rvalue ссылки на тип объекта, например static_cast<char&&>(x)
То же, что и std::move
. Кроме того, почему std::move
определено для использования static_cast
, а не dynamic_cast
?
любого выражения, обозначающего временный объект, после временной материализации. (начиная с C ++ 17)
Какая разновидность временной материализации (я знаю ту, что касается инициализации const ref)? Любой пример для этого?
Спасибо.