Когда-то я предполагал, что такой код не сработает:
const MyClass& obj = MyClass();
obj.DoSomething();
потому что объект MyClass будет уничтожен в конце его полного выражения, оставив obj в качестве висячей ссылки. Однако я узнал (здесь), что это не так; на самом деле стандарт имеет специальное положение, которое позволяет ссылаться на константные ссылки, чтобы поддерживать временные ресурсы до тех пор, пока указанные ссылки не будут уничтожены сами. Но, было подчеркнуто, только эта константа имеет эту силу. Сегодня я провел код в VS2012 в качестве эксперимента.
struct Foo
{
Foo() { std::cout << "ctor" << std::endl; }
~Foo() { std::cout << "dtor" << std::endl; }
};
void f()
{
Foo& f = Foo();
std::cout << "Hello world" << std::endl;
}
Вывод при вызове f()
был:
ctor
Hello world
dtor
Итак, я посмотрел проект стандарта С++ 11 и нашел это (§ 12.2/4):
Существует два контекста, в которых временные другая точка, чем конец полного выражения. Первый контекст [не подать выражение]. Второй контекст - это когда ссылка привязана к временный характер. Временное, к которому привязана ссылка, или временный, который является полным объектом подобъекта, которому ссылка привязана для времени жизни ссылки.
Слово const
явно отсутствует в приведенном выше. Так; это поведение было изменено для С++ 11, был ли я ошибочным в отношении вещи const
для начала или у VS2012 есть ошибка, и я просто не нашел соответствующую часть стандарта?