Продление жизни временного объекта за счет получения ссылки на подобъект

Существует небольшая разница между языком, используемым на cppreference.com и Стандарт C ++ 11 относительно того, когда продлевается срок службы временного объекта (выделено мной).

С сайта cppreference.com:

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

Из Стандарт C ++ 11:

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

Согласно стандарту, субъектом может быть субъект-член, субъект базового класса. , или элемент массива.

Если мы будем строго придерживаться стандарта в следующем примере кода

struct Foo 
{
   Foo() : a(10), b(20) {}
   ~Foo() { std::cout << "In Foo::~Foo()\n"; }
   int a;
   int b;
};

Foo getFoo()
{
   return Foo();
}

void testFoo1()
{
   int const& r = getFoo().a;
   std::cout << "In testFoo1()\n";
   (void)r; // Shut up the compiler
}

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

Является ли многословие, используемое стандартом, дефектом?
Компилятор не соответствует требованиям?
Является ли многословие, используемое cppreference.com, дефектом?

Обновить

Язык, используемый на cppreference.com, был обновлен до (выделено мной) :

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


person R Sahu    schedule 26.05.2017    source источник
comment
Компилятор не делает того, что говорит стандарт. Должен быть баг в стандарте! Не может быть ошибки в компиляторе!   -  person T.C.    schedule 26.05.2017
comment
Помимо Снаряжения, см. gcc.gnu.org/bugzilla/show_bug.cgi?id= 54293. Это исправлено в GCC 7. cppreference и стандарт верны, как написано.   -  person T.C.    schedule 26.05.2017
comment
@ T.C., Многословие, используемое cppreference.com, подразумевает, намеренно или нет, срок жизни временного объекта не продлевается путем получения ссылки на подобъект-член.   -  person R Sahu    schedule 26.05.2017
comment
Ну, не сказано, что это не расширено ... исправлено.   -  person T.C.    schedule 26.05.2017
comment
Работайте должным образом с помощью gcc / clang, здесь.   -  person Jarod42    schedule 26.05.2017


Ответы (1)


Является ли словоблудие, используемое в стандарте, дефектом?

No.

Компилятор не соответствует требованиям?

да. Как было указано в комментарии, это было исправлено в более новой версии g ++, g ++ 7. Связанная ссылка: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54293.

Является ли словоблудие, используемое cppreference.com, дефектом?

да. Содержимое страницы cppreference.com было обновлено.

person R Sahu    schedule 26.06.2017
comment
Я немного удивлен, что никто не указал, что это константная ссылка, а не простая ссылка. Это имеет огромное значение. Неконстантная ссылка не будет иметь такого же эффекта. - person shargors; 26.06.2017
comment
@shargors подразумевается часть const&. Вы не можете получить неконстантную ссылку на временный объект или подобъект временного объекта. - person R Sahu; 26.06.2017
comment
Это правильно. Я предполагаю, что в стандарте это четко прописано. - person shargors; 26.06.2017