将CComBSTR移动到std :: vector?

时间:2015-05-12 09:54:47

标签: c++11 atl

有没有办法将CComBSTR对象移动到std :: vector而不复制底层字符串?似乎以下代码不起作用。

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

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

2 个答案:

答案 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));