Этот вопрос спрашивает, все ли временные значения
Ответ — нет, потому что, если мы рассмотрим это выражение:
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)
правда?
Выражения, которые дают временные объекты являются г-значение. Существует специальное правило, которое позволяет ссылкам const-reference и r-value связываться с r-значениями, и это продлевает время жизни временного объекта до срока действия ссылки (см. 12.2 (5)), но это не делает временное -объектное выражение не меньше r-значения.
Однако после привязки к ссылке у самой ссылочной переменной есть имя, и, таким образом, ссылочное выражение является l-lvalue.
Не путайте выражения, переменные и объекты.
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()
является именующий-выражение. Оба они относятся к временный объект, который исчезнет в конце полного выражения.