C ++ - поиск примеров значений x - PullRequest
0 голосов
/ 04 октября 2019

Я читаю 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)? Любой пример для этого?


Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...