Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Возвращение из функции &&

В популярной статье заметил подобный код:
int&& f() { return 2; }
Тут xvalue, но на временную переменную в стеке функции. Он будет не корректен, правильно? Знаю что &&/const& продлевают жизнь (12.2/5), но не в таком контексте же:
const int& f() { return 2; }
Может быть, в первом коде, какой то трюк с литералом и xvalue?
(Этот код должен быть некорректным, но статья популярней меня)


Ответ

Чтобы убедиться, что функция некорректна, можно запустить следующую тестовую программу
#include
struct Int { Int( int x ) : x( x ) { std::cout << "Int::Int( int )" << std::endl; } ~Int() { std::cout << "Int::~Int()" << std::endl; x = 100; } Int( const Int &rhs ) : x( rhs.x ) { std::cout << "Int::Int( const Int & )" << std::endl; } Int( Int &&rhs ) : x( rhs.x ) { std::cout << "Int::Int( Int && )" << std::endl; }
int x; };
std::ostream & operator <<( std::ostream &os, const Int &rhs ) { return os << rhs.x; }
Int && f() { return 2; }
int main() { Int x = f();
std::cout << "x = " << x << std::endl; }
Ее вывод на консоль может выглядеть следующим образом (хотя из-за неопределенного поведения программы вывод может отличаться)
Int::Int( int ) Int::~Int() Int::Int( Int && ) x = 100 Int::~Int()
Как видно в функции main переменная x получила значение уже удаленного объекта.

Комментариев нет:

Отправить комментарий