Все временные файлы rvalues в C++?

Я кодировал в C++ в течение прошлых нескольких лет. Но существует один вопрос, который я не смог выяснить. Я хочу спросить, все временные файлы в C++, rvalues?

Если не, кто-либо может предоставить мне пример, где временный произведенный в коде lvalue?

34
задан Prasoon Saurav 7 December 2011 в 12:59
поделиться

6 ответов

Нет.

Спецификация языка C ++ никогда не делает такого прямого утверждения, как то, о котором вы спрашиваете. Нигде в языковом стандарте не сказано, что «все временные объекты являются r-значениями». Более того, сам вопрос немного неверен, поскольку свойство быть rvalue на языке C ++ не является свойством объекта, а скорее свойством выражения (то есть свойством его результата). Фактически это определено в спецификации языка: для различных видов выражений он говорит, когда результатом является lvalue, а когда - rvalue. Помимо прочего, это на самом деле означает, что к временному объекту можно обращаться как к rvalue, так и к lvalue, в зависимости от конкретной формы выражения, используемой для выполнения доступа.

Например, результатом выражения литерала 2 + 3 , очевидно, является rvalue, временное значение типа int . Мы не можем применить к нему унарные & , поскольку унарные & требуют lvalue в качестве своего операнда

&(2 + 3); // ERROR, lvalue required

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

const int &ri = 2 + 3;

В этом случае ссылка прикрепляется к временному, продлевая срок службы последнего. Очевидно, что как только это будет сделано, мы получим доступ к тому же самому временному объекту, как lvalue ri , поскольку ссылки всегда являются lvalue. Например, мы можем легко и законно применить унарные & к ссылке и получить указатель на временный

const int *pi = &ri;

, при этом этот указатель остается совершенно действительным, пока сохраняется временное.

Другой очевидный пример доступа lvalue к временному объекту - это когда мы обращаемся к временному объекту типа класса через его указатель this . Результатом * this является lvalue (как всегда бывает с результатом унарного * , примененного к указателю данных), но это не меняет того факта, что фактическое объект легко может быть временным. Для данного типа класса T выражение T () является rvalue, как явно указано в стандарте языка, но временный объект, доступ к которому осуществляется через * T (). Get_this Выражение () (с очевидной реализацией T :: get_this () ) является l-значением. В отличие от предыдущего примера, этот метод позволяет немедленно получить неконстантное lvalue, которое относится к временному объекту.

Итак, еще раз, один и тот же временный объект может легко «рассматриваться» как rvalue или как lvalue в зависимости от того, какое выражение (какой путь доступа ) вы используете для «просмотра "на этом объекте.

44
ответ дан 27 November 2019 в 16:58
поделиться

Ну, этот оператор массива возвращает ссылку, любую функцию, которая возвращает ссылку, можно считать, что можно считать то же самое? Все ссылки - это const, пока они могут быть Lvalues, они изменяют то, что они ссылаются, а не сама ссылка. То же самое верно для оператора * ,

* (указатель температуры) = val;

Я клянусь, я использовал для использования некоторых компилятора, которые передают значения Temp к любой функции, которая приняла ссылку,

Итак, вы можете пойти:

int Afunc()
{
   return 5;
}

int anotherFunc(int & b)
{
    b = 34;
}


anotherFunc(Afunc());

Не можете найти то, что позволяет вам сделать это, хотя эта ссылка должна быть Const, чтобы обеспечить прохождение значений TEMP.

int anotherFunc(const int & b);

Во всяком случае, ссылки могут быть Lvalues ​​и временными, трюк, являющийся ссылкой, она не модифицирована, только то, что он ссылается.

Если вы считаете, что оператор -> [1124999] -> -> -> -> -> , как оператор, то временные указатели могут быть Lvalues, но применимо то же состояние, это не указатель Temp, который будет изменен, но то, что она указывает на Отказ

1
ответ дан 27 November 2019 в 16:58
поделиться

Работа индексации массива - это временная, так и Lvalue, что-то вроде [10] = 1, является примером того, что вы ищете; Lvalue - это временный, рассчитанный указатель.

0
ответ дан 27 November 2019 в 16:58
поделиться

Вы собираетесь изменить исключение? Если нет, это может быть консте. Та же причина, по которой вы должны использовать Const где-либо еще (я говорю, должен, потому что он на самом деле не делает так много раз отличии на поверхности, может помочь компиляторам, а также помогать кодерам использовать ваш код правильно, а не делать не следует)

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

-121--880652-

Это зависит от того, что вы считаете временной переменной. Вы можете написать что-то вроде

#include <stdio.h>
int main()
{
    char carray[10];
    char *c=carray+1;
    *(c+2+4) = 9;
    printf("%d\n",carray[7]);
    return 0;
}

, это работает в Visualstudios и GCC. Вы можете запустить код в CodePad

Я считаю (C + 2 + 4) rvalue, хотя я хочу присвоить ему. Когда я не размышляю об этом, это стало бы Lvalue. Так что да, все временные являются рвале. Но вы можете сделать RValues ​​(таким образом, временный) в Lvalue, развесел его

0
ответ дан 27 November 2019 в 16:58
поделиться

Краткий ответ: Да, но я не собираюсь процитировать стандарт, потому что доказательство того, что то нуждается в том, чтобы удовлетворить все виды временного. По определению временно имеет срок службы одного утверждения, поэтому присвоение вещей можно было бы лучшему стилю в лучшем случае.

Интересный ответ: Элиз копирования может сделать (часто делает) временный объект, идентичный с объектом Lvalue. Например,

MyClass blah = MyClass( 3 ); // temporary likely to be optimized out

или

return MyClass( 3 ); // likely to directly initialize object in caller's frame

редактировать: как для вопроса о том, есть ли какой-либо временный объект в этих случаях, § 12,8 / 15 упоминается

Работа копирования может быть опущена путем построения временного объекта напрямую В цель пропущенной копии

, которая указывала бы, что существует временный объект, который может быть идентичным с Lvalue.

0
ответ дан 27 November 2019 в 16:58
поделиться

Prasoon Saurav уже связан очень хорошая нить CLC ++. В тудах Джеймс Канзе объясняет, почему вопрос не имеет смысла. Это сводится к:

  • rvalue-ness - это (булевое) свойство выражений - каждое выражение либо Lvalue, либо RValue
  • не выражения

по этой причине Вопрос не имеет смысла.

Хороший пример является следующим кодом:

int main() {
  const int& ri = 4;
  std::cout << ri << std::endl; 
}

Временная INT со значением 4 не является выражением. Выражение RI , которое печатается не временным. Это Lvalue, и относится к временному.

9
ответ дан 27 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: