2015-05-12 2 views
0

Есть ли способ перемещения объекта CComBSTR в std :: vector без копирования базовой строки? Кажется, что следующий код не работает.Переместить CComBSTR в std :: vector?

CComBSTR str(L"SomeStr"); 
std::vector<CComBSTR> vStr; 

vStr.push_back((CComBSTR)str.Detach()); 
+0

re "(CComBSTR)" литье. Никогда не бросайте в неведении. – Steve

ответ

0

Я сделал некоторый эксперимент и, кажется, последний CComBSTR поддерживает движение семантики, так что можно записать в виде:

CComBSTR str(L"SomeStr"); 
std::vector<CComBSTR> vStr; 

vStr.push_back(std::move(str)); 
1

Ваш код не работает, потому что Detach дает вам BSTR, не CComBSTR. Вы могли бы использовать std::vector<BSTR> vStr, если вы понимаете, что BSTR указывает на первый символ строки, но есть также префикс длины перед памятью, на которую он указывает (см., Например, BSTR (Automation)), поэтому вам нужно быть осторожным с управляя им.

В качестве альтернативы, вы могли бы использовать

CComBSTR str(L"SomeStr"); 
std::vector<CComBSTR> vStr; 

vStr.push_back(str); 

которая могла бы сделать копию строки.

На странице MSDN по адресу CComBSTR не указано, что у нее есть какая-либо семантика движения, но она, возможно, была добавлена ​​в код без обновления документации. Я так не думаю, и в этом случае ваше решение std::move в вашем ответе будет таким же, как мой второй пример: простая копия.

+0

Я проверил, что в моем 'class CComBSTR' есть конструктор перемещения, поэтому ожидается операция перемещения. Я должен проверить, действительно ли это происходит. – Thomson

+0

Если он там, вы можете ожидать, что он сработает, и вы можете это использовать. – MicroVirus