Продлевается ли срок жизни xvalue, когда он связан с ссылкой на const lvalue? - PullRequest
8 голосов
/ 27 февраля 2012

Если я напишу следующий код:

#include <iostream>

using namespace std;

int main()
{
  cout << &(int &&)123 << endl;
  return 0;
}

Тогда g++ жалуется:

foo.cc: In function ‘int main()’:
foo.cc:7:20: error: taking address of xvalue (rvalue reference)

Хорошо, спасибо Что такое rvalues, lvalues, xvalues, glvalues ​​и prvalues? Я понял, что xvalue означает, что он «истекает», что имеет смысл. Но теперь, если я сделаю это:

#include <iostream>

using namespace std;

int main()
{
  const int &x = (int &&)123;
  cout << &x << endl;
  return 0;
}

Это "работает" просто отлично и напечатает адрес. Итак, у меня есть несколько вопросов:

  1. Если значение истекает, почему я могу сделать ссылку на него? Ссылка не сохранит исходный объект живым (верно?).
  2. Приводит ли такая ссылка к неопределенному поведению? Например. потому что мы ссылаемся на объект, который мог быть уничтожен?

В общем, есть ли способ узнать время жизни ссылки на rvalue?

Ответы [ 2 ]

9 голосов
/ 28 февраля 2012

Возможно, я один, но я думаю, что это небезопасно:

const int &x = (int &&)123;

Правила продления жизни применяются только тогда, когда ссылка инициализируется выражением, которое непосредственно ссылается на временный объект.Другими словами, выражение должно содержать атрибут «временный».Если вы пропустите (int&&), то для привязки к ссылке компилятор неявно создаст выражение prvalue, которое ссылается на временный объект, который инициализируется значением 123, и затем применяется удлинение времени жизни.

Но если вы смешиваете rvalue-ссылки между ними, компилятор не сможет узнать во время время компиляции , продлевать или нет время жизни ссылаемого объекта.

int a = 0;
const int &x = ((rand() == 42) ? (int&&)123 : (int&&)a);

I для этогодумайте, что ваш код имеет неопределенное поведение, потому что вы оцениваете висячую ссылку (даже если только для получения ее адреса).

3 голосов
/ 27 февраля 2012

Пункт 12.2, параграфы 4-5, говорит, что время жизни продлено во втором примере

Существуют два контекста, в которых временные уничтожаются в другой точке, чемконец полного выражения....

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

...