Надо бы в этюды, но пусть будет в КСВ
http://habrahabr.ru/post/140578/
Добрый день!
Еще вчера я честно думал, что разобрался как работают rvalue references в C++11. Думал до тех пор, пока не наткнулся на грабли.
Итак, я предлагаю размять мозги и попробовать написать функцию move_if_rr. Такой себе тест на понимание: успех засчитывается за функцию, которая работает правильно при условии, что Вы ее ни разу не отлаживали. Детали задания под катом.
Итак, условие.
Пусть, есть следующий код:
template< class U >
class Container
{
U member;
public:
U &Get(){ return member; }
const U &Get() const{ return member; }
public:
template< class T > void dummy( const Container< T > & ); // copy
template< class T > void dummy( Container< T > && ); // move
public:
Container() {}
// Ожидается, что T - это нечто совместимое с Container
template< class T >
Container( T &&rr ) : member( move_if_rr< T >( rr.Get() ) )
{
// dummy( std::forward< T >( rr ) )
}
};
Container намеренно сделан шаблонным, чтобы реальный тип member был неизвестен.
Функции dummy нужны только, для того, чтобы разъяснить семантику move_if_rr (ниже по тексту).
Необходимо написать функцию move_if_rr, удовлетворяющую следующим правилам:
Если закомментированный forward в конструкторе Container, вызовет f, помеченную как move, то:
— Использование move_if_rr должно приводить к вызову move конструктора поля member.
Если закомментированный forward в конструкторе Container, вызовет f, помеченную как copy, то:
— Использование move_if_rr должно приводить к вызову конструктора копирования поля member.
Оба правила предполагают, что в качестве аргумента конструктору Container был передан тип Container.
Не все равно не понял forwars возвращает rr. Тогда как так?
Здравствуйте, Mamut, Вы писали:
M>А понимаете ли Вы move семантику?
да
M>Надо бы в этюды, но пусть будет в КСВ
не взлетит.
Здравствуйте, Mamut, Вы писали:
M>Надо бы в этюды, но пусть будет в КСВ
До чего С++ довели...
Здравствуйте, _Obelisk_, Вы писали:
M>>Надо бы в этюды, но пусть будет в КСВ
_O_>До чего С++ довели...
Гы, Мамут просто нашёл очередного кандидата на неисчерпаемую тему.