使用iostream(std :: wcout)打印CComBSTR

vkrzv

如下代码

#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
测试

我试图用调试器调查每种情况下发生的转换,但是两次都进入了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

现场演示

在您的示例中,的隐式转换被触发,但不是由实例化的模板触发的(因为该转换是“用户定义的”,并且模板参数匹配不考虑用户定义的转换)。那么唯一可行的候选者为非模板,到您的转换通过。CComBSTRBSTRoperator<<(const wchar_t*)operator<<(const void*)BSTR

实际上,在标准(LWG 2342)中提出了一个解决方案,该提案的文本对此进行了更详细的说明。

综上所述:

对于宽流参数类型wchar_t const*wchar_t仅作为模板参数支持。模板参数匹配不考虑用户定义的转换。因此不适当重载operator<<时是所必需的参数,它是与用于行为不一致的隐式转换被选择char const*char,是意想不到的,并且是无用的结果。

剩下的唯一可行的重载就是一个,const void*并且,因为每个指针都可以隐式转换为const void*,所以这就是您要获得的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std::wcout 打印 unicode 字符但它们被隐藏

在Linux终端中使用`std :: wstring`和`std :: wcout`打印拉丁字符

如何使用std :: imbue设置std :: wcout的语言环境?

wcout不会打印正确的单引号

std :: cout和std :: wcout有什么区别?

std :: wcout奇怪的错误:std :: wstring的输出被截断

WCOUT和COUT中未打印的ASCII字符

std :: iostream是非阻塞的吗?

使用命名空间std后,为什么还要包含头文件<iostream>?

错误:标识符“ cout”未定义。包含<iostream>并使用命名空间std;

即使使用std ::和<iostream>,cout和endl仍未定义

使用std :: ostream作为打印函数的参数

使用 std::cout 打印 #define 宏

为什么std :: unordered_set不采用CComBSTR类型作为键?

我无法使用wcout输出字符串

如何使用std :: fprintf()打印长字符串?

无法使用std :: cout打印/输出任何内容

如何不使用std lib函数打印内容?

如何使用std :: variant打印地图键/值?

std :: copy和std :: ostream_iterator使用重载函数来打印值

如何使用std :: copy_n打印出std :: vector的内容?

使用 std::range::copy 和适配器打印 std::map

为什么在包含<iostream>之后必须写std :: cin?

如何使用C ++配置gnuplot-iostream?

使用带有 std::cout 的单引号打印字符串实际打印数字

如果不使用<iostream>,可以避免使用它吗?

使用std :: ostream打印可变参数包的最简单方法是什么?

如何使用Java运行时打印Python脚本的std输出?

为什么C ++使用std ::十六进制,而不是资本时打印小案字母?