Существует небольшая разница между языком, используемым на 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, был обновлен до (выделено мной) :
Всякий раз, когда ссылка привязана к временному объекту или его подобъекту, время жизни временного увеличивается, чтобы соответствовать времени жизни ссылки, со следующими исключениями: