Страницы

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

суббота, 7 декабря 2019 г.

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

#cpp #cpp11


В популярной статье заметил подобный код:

int&& f()
{
      return 2;
}


Тут xvalue, но на временную переменную в стеке функции. Он будет не корректен, правильно?
Знаю что &&/const& продлевают жизнь (12.2/5), но не в таком контексте же:

const int& f()
{
     return 2;
}


Может быть, в первом коде, какой то трюк с литералом и xvalue?

(Этот код должен быть некорректным, но статья популярней меня)
    


Ответы

Ответ 1



Чтобы убедиться, что функция некорректна, можно запустить следующую тестовую программу #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 получила значение уже удаленного объекта.

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

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