将 CComBSTR 移动到 std::vector?

Move CComBSTR to std::vector?

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

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

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

我做了一些实验,似乎最新的 CComBSTR 支持移动语义,所以它可以写成:

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

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

您的代码无效,因为 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 答案中的解决方案将与我的第二个示例相同:一个简单的副本。