gpt4 book ai didi

c++ - 使用 iostream 打印 CComBSTR (std::wcout)

转载 作者:行者123 更新时间:2023-11-30 04:43:50 24 4
gpt4 key购买 nike

以下code :

#include <iostream>
#include <atlstr.h>

int main()
{
CComBSTR bstr(L"test");
std::wcout << bstr << std::endl;
std::wcout << static_cast<BSTR>(bstr) << std::endl;
}

打印

033FA16C
test

我尝试使用调试器调查在每种情况下发生了哪些转换,但两次都进入了 operator BSTR。那么为什么第一行打印地址而第二行打印文本呢?

最佳答案

我们可以从中完全删除 ATL,因为这实际上是一个如何 wcout 的问题有效。

考虑以下最小示例:

#include <iostream>

struct Foo
{
operator const wchar_t*() const { return L"what"; };
};

int main()
{
Foo f;
std::wcout << f << std::endl;
std::wcout << (const wchar_t*)f << std::endl;
}

// Output:
// 0x400934
// what

( live demo )

在您的示例中,the implicit conversion来自 CComBSTRBSTR被实例化 operator<<(const wchar_t*) 的模板触发,但不是 (因为转换是“用户定义的”,模板参数匹配不考虑用户定义的转换)。唯一可行的候选者是非模板 operator<<(const void*) , 您转换为 BSTR已通过。

在标准 ( LWG 2342 ) 中实际上有一个“修复”这个问题的提案,提案的文本对此进行了更详细的解释。

总结:

For wide streams argument types wchar_t const* and wchar_t are supported only as template parameters. User defined conversions are not considered for template parameter matching. Hence inappropriate overloads of operator<< are selected when an implicit conversion is required for the argument, which is inconsistent with the behavior for char const* and char, is unexpected, and is a useless result.

剩下唯一可行的过载是使用 const void* 的那个而且,因为每个指针都可以隐式转换为 const void* ,这就是你得到的。

关于c++ - 使用 iostream 打印 CComBSTR (std::wcout),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58014041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com