Я рассказываю здесь длинную предысторию, потому что, помимо прямого ответа, я хотел бы знать, правильны ли мои рассуждения, которые привели к этой ситуации.Зачем мне нужно вызвать std :: move на временном dynamic_bitset?
У меня есть функция, принимающая аргумент dynamic_bitset<>
(от Boost.dynamic_bitset). Скажите, что это выглядит так.
void foo(boost::dynamic_bitset<> db) {
// do stuff
}
Так получился, что это только когда-либо вызывается временными, построенным из конструктора, так как в foo(boost::dynamic_bitset<>{5}.set())
(звонить с 5-битным BitSet со всеми установленными битами).
Мои биты имеют только небольшое количество бит (менее 32). Поэтому сначала я подумал: «Я просто передам его по значению, а копия меньше указателя». Но потом я подумал: «Это динамично, поэтому он должен выделять пространство в куче. Я хочу избежать ненужных распределений и освобождений».
Таким образом, я мог бы сделать это
void foo(const boost::dynamic_bitset<>& db);
Но ссылка является указателем, и dynamic_bitset (предположительно) имеет указатель на его данные, так затем с помощью db
в foo
бы пройти через два уровня косвенности , который кажется немым. Ясно, что лучшим способом было бы скопировать указатель на данные в foo
, не перераспределяя и не копируя данные в кучу.
"Ага!" Я говорю. «Конечно, для этого и есть семантика движения». Таким образом, изменить подпись
void foo(boost::dynamic_bitset<>&& db);
Но тогда, вызывая foo(boost::dynamic_bitset<>{5}.set())
дает ошибку компилятора, cannot bind 'boost::dynamic_bitset<>' lvalue to 'boost::dynamic_bitset<>&&'
. Я должен позвонить foo(std::move(boost::dynamic_bitset<>{5}.set()))
, а затем все работает.
Зачем мне нужно звонить std :: move? Кажется, что это явно значение xvalue (временное истечение срока действия), не так ли?
не зависит, что бы на то, что 'set' это? –