Нужно ли иметь временный или буквальный, чтобы иметь значение?

Этот вопрос спрашивает, все ли временные значения

Ответ — нет, потому что, если мы рассмотрим это выражение:

const int &ri = 2 + 3;

то же самое временное (2 + 3), который здесь является rvalue, может быть использован
как значение в последующем выражении:

const int *pi = &ri;

так что это временное не является (только) значением.

Логическое утверждение temporary ==> rvalue тогда ложно.

Тем не менее, мы не можем написать

const int &ri = &(2 + 3); // illegal, 2 + 3 -> temporary -> rvalue

или же

int *i = &4; // illegal, 4 is an rvalue (literal)

или же

int foo();
int *i = &foo(); // illegal, foo() -> temporary -> rvalue

Таким образом, мой вопрос в том, можем ли мы генерировать значение в определенном выражении без
иметь временный или буквальный? Является rvalue ==> (temporary or literal) правда?

1

Решение

Выражения, которые дают временные объекты являются г-значение. Существует специальное правило, которое позволяет ссылкам const-reference и r-value связываться с r-значениями, и это продлевает время жизни временного объекта до срока действия ссылки (см. 12.2 (5)), но это не делает временное -объектное выражение не меньше r-значения.

Однако после привязки к ссылке у самой ссылочной переменной есть имя, и, таким образом, ссылочное выражение является l-lvalue.

Не путайте выражения, переменные и объекты.

5

Другие решения

Rvalue а также именующий атрибуты применяются к выражениям, а не к объекты. Выражение может быть именующий или Rvalue. Упрощение выражения, которое дает значение является Rvalue-выражение и выражение, которое дает объект, является именующий-выражение. именующий в Rvalue обращение является актом чтение стоимость объекта.

Выражение, которое дает временное и литеральное RValue-выражение они представляют значение не фактический объект.

В вашем примере:

const int &ri = 2 + 3;
const int *pi = &ri;

Выражение 2+3 является Rvalue-выражение используется для инициализации постоянной ссылки. Это, в соответствии с языком, подразумевает продление времени жизни временного объекта за пределы текущего выражения и до тех пор, пока ссылка не выйдет из области видимости. После этого во втором выражении подвыражение ri является именующий-выражение это относится к временному объекту, срок жизни которого был продлен.

Обратите внимание, что есть и другие способы создания Rvalue выражения с временными, например, вызов члена, который дает ссылку:

struct test {
test& thisTest() { return *this; }
};
test foo();
... foo().thisTest()

Подвыражение foo() является Rvalue-выражение, но выражение foo().thisTest() является именующий-выражение. Оба они относятся к временный объект, который исчезнет в конце полного выражения.

3

По вопросам рекламы [email protected]