А понимаете ли Вы move семантику?
От: Mamut Швеция http://dmitriid.com
Дата: 23.03.12 12:51
Оценка:
Надо бы в этюды, но пусть будет в КСВ

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.



dmitriid.comGitHubLinkedIn
Re: А понимаете ли Вы move семантику?
От: vpchelko  
Дата: 23.03.12 16:53
Оценка:
Здравствуйте, Mamut, Вы писали:

http://en.cppreference.com/w/cpp/utility/forward
Сало Украине, Героям Сала
Re[2]: А понимаете ли Вы move семантику?
От: vpchelko  
Дата: 23.03.12 16:58
Оценка:
Не все равно не понял forwars возвращает rr. Тогда как так?
Сало Украине, Героям Сала
Re: А понимаете ли Вы move семантику?
От: о_О
Дата: 23.03.12 17:09
Оценка:
Здравствуйте, Mamut, Вы писали:

M>А понимаете ли Вы move семантику?

да

M>Надо бы в этюды, но пусть будет в КСВ

не взлетит.
Re: А понимаете ли Вы move семантику?
От: _Obelisk_ Россия http://www.ibm.com
Дата: 24.03.12 15:30
Оценка: +1
Здравствуйте, Mamut, Вы писали:

M>Надо бы в этюды, но пусть будет в КСВ


До чего С++ довели...



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[2]: А понимаете ли Вы move семантику?
От: dimgel Россия https://github.com/dimgel
Дата: 24.03.12 22:45
Оценка:
Здравствуйте, _Obelisk_, Вы писали:

M>>Надо бы в этюды, но пусть будет в КСВ


_O_>До чего С++ довели...


Гы, Мамут просто нашёл очередного кандидата на неисчерпаемую тему.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.