В популярной статье заметил подобный код:
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 получила значение уже удаленного объекта.
Комментариев нет:
Отправить комментарий