将 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
答案中的解决方案将与我的第二个示例相同:一个简单的副本。
有没有办法在不复制底层字符串的情况下将 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
答案中的解决方案将与我的第二个示例相同:一个简单的副本。