有没有办法将CComBSTR对象移动到std :: vector而不复制底层字符串?似乎以下代码不起作用。
CComBSTR str(L"SomeStr");
std::vector<CComBSTR> vStr;
vStr.push_back((CComBSTR)str.Detach());
答案 0 :(得分:1)
您的代码无效,因为Detach
为您提供了BSTR
,而不是CComBSTR
。您可以使用std::vector<BSTR> vStr
,只要您意识到BSTR
指向字符串的第一个字符,但在它指向的内存之前还有一个长度前缀(例如,请参阅BSTR (Automation)),因此您需要小心管理它。
或者,您可以使用
CComBSTR str(L"SomeStr");
std::vector<CComBSTR> vStr;
vStr.push_back(str);
将制作字符串的副本。
CComBSTR上的MSDN页面并未表明它具有任何移动语义,但它可能已添加到代码中而不更新文档。
我不这么认为,在这种情况下,你的答案中的std::move
解决方案将与我的第二个例子相同:简单的副本。
答案 1 :(得分:0)
我已经完成了一些实验,似乎最新的CComBSTR支持移动语义,所以它可以写成:
CComBSTR str(L"SomeStr");
std::vector<CComBSTR> vStr;
vStr.push_back(std::move(str));