С++ 11 lvalue, rvalue, подробная ссылка на rvalue

искусственный интеллект

lзначение, значение
В C++11 все значения должны принадлежать одному из значений lvalue и rvalue, а rvalue можно подразделить на prvalue и xvalue. В C++11 lvalue, которое может принимать адрес и иметь имя, является lvalue, и наоборот, rvalue (xvalue или prvalue), которое не может принимать адрес и не имеет имени. Например, int a = b+c, a — lvalue, а имя его переменной — a, а адрес переменной можно получить через &a; возвращаемое значение выражения b+c и функцию int func() является значением r, мы не можем найти его по имени переменной, пока оно не будет присвоено переменной, и такие операции, как &(b+c), не будут компилироваться.

rvalue, умирающее значение
Прежде чем понять rvalue в C++11, давайте взглянем на концепцию rvalue в C++98: rvalue в C++98 — это prvalue, которые относятся к значениям временных переменных и не являются связанные с объектами буквальное значение . Временные переменные относятся к возвращаемым функциям значениям, выражениям и т. д., возвращаемым без ссылки, например, возвращаемое значение функции int func(), выражение a+b, литеральные значения, не связанные с объектами, такие как true, 2, "С" и т.д.

C++11 расширяет rvalue в C++98. В C++11 rvalue далее подразделяются на чистые rvalue (prvalue, Pure Rvalue) и xvalues ​​(eXpiring Value). Понятие чистого rvalue эквивалентно нашему понятию rvalue в стандарте C++98, которое относится к временным переменным и литеральным значениям, не связанным с объектами; xvalue — это новое дополнение к C++11. значение относится к связанному выражению, так что выражение обычно представляет собой объект, который нужно переместить (переместить для другого использования), например, возвращаемое значение функции, возвращающей ссылку rvalue T&&, возвращаемое значение std::move или преобразование типа в T&& Возвращаемое значение функции.

Смерть значения можно понимать как приобретение путем «кражи» значений памяти других переменных. Убедитесь, что другие переменные больше не используются или будут уничтожены, освобождение и распределение пространства памяти можно избежать путем «кражи», может продлить срок службы значения переменной.

ссылка lvalue, ссылка rvalue
Ссылка lvalue — это тип, который ссылается на lvalue. Ссылка на rvalue — это тип ссылки на rvalue.На самом деле, поскольку rvalue обычно не имеет имени, мы можем найти его существование только по ссылке.

И ссылки rvalue, и ссылки lvalue являются ссылочными типами. Независимо от того, объявлена ​​ли ссылка lvalue или ссылка rvalue, она должна быть немедленно инициализирована. Причину этого можно понять, поскольку сам ссылочный тип не владеет памятью привязанного объекта, а является псевдонимом для объекта. Ссылка lvalue — это псевдоним значения именованной переменной, а ссылка rvalue — это псевдоним безымянной (анонимной) переменной.

Ссылка lvalue обычно также не может быть привязана к rvalue, но ссылка const lvalue является «универсальным» типом ссылки. Он может принимать неконстантное lvalue, const lvalue, rvalue для его инициализации. Но rvalue, на которое ссылается const lvalue, может быть доступен только для чтения до конца своей жизни. И наоборот, неконстантные lvalue могут принимать только неконстантные lvalue для их инициализации.

int &a = 2; # ссылка lvalue привязана к rvalue, компиляция не удалась

int b = 2; # неконстантное lvalue
const int &c = b; # ссылка на константное lvalue привязана к неконстантному lvalue, компилируется через
const int d = 2;# const lvalue
const int &e = c; # ссылка на const lvalue привязана к const lvalue, компилируется через
const int &b =2; # Ссылка на константу lvalue привязана к rvalue, запрограммированному через

Ссылка на rvalue обычно не может быть привязана к какому-либо lvalue.Чтобы связать lvalue со ссылкой на rvalue, обычно требуется std::move() для приведения lvalue к rvalue, например:

int a;
int &&r1 = c; # Ошибка компиляции
int &&r2 = std::move(a); # Скомпилировано

В следующей таблице перечислены типы значений, на которые могут ссылаться различные типы ссылок в C++11. Стоит отметить, что пока ссылочный тип rvalue может быть привязан, время жизни rvalue может быть продлено.

———————————————
Заявление об авторских правах: эта статья является оригинальной статьей блоггера CSDN "hyman_yx", которая соответствует соглашению об авторских правах CC 4.0 BY-SA. Пожалуйста, приложите ссылку на оригинальный источник и это заявление для перепечатки.
Оригинальная ссылка:blog.CSDN.net/Hyman_maybe/AR…