c++ - gcc 深/双/嵌套类型转换

标签 c++ visual-c++ gcc

首先是代码

#include <stdio.h>

typedef wchar_t* BSTR;

wchar_t hello[] = L"Hello";

class _bstr_t {
public:
    operator const wchar_t*() const throw() { return hello; }
    operator wchar_t*() const throw() { return hello; }
};

class container {
public:
    operator _bstr_t() { return _bstr_t(); }
};

int main()
{
    // This gives error (with gcc 4.5.2 at least):
    // test.cpp:20:27: error: cannot convert "container" to "wchar_t*" in initialization
    wchar_t *str = container();
    printf("%S\n", str);
    return 0;
}

这里的问题是 container() 可以转换为 _bstr_t 然后转换为 wchar_t*,但是 gcc 不能。

问题可以通过手动转换解决:

wchar_t *str = (_bstr_t)container();

但我需要的是避免手动转换,我希望 gcc 自动解决这个问题。

为什么我需要这个是因为返回的容器类型对象将在像这样的调用中使用

void Func(wchar_t* str);
Func(myObject->Container);

我不想手动转换的地方。

我验证了 Visual Studio,它似乎也不支持这种情况。太糟糕了,但如果有人可以提供解决方法,我会很高兴,即使是针对这种特定情况。

更新:对于那些建议在容器上使用 operator wchar_t* 的人,首先是问题所在。这将在 Func() 有机会接受指针之前被销毁时泄漏或崩溃。

最佳答案

进行隐式转换时,最多一个 可能发生的用户定义转换。在这个问题上,MSVC 行为不符合标准。

C++11(12.3 转换):

At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.

要使隐式转换起作用,container 必须直接转换为 wchar_t*

关于c++ - gcc 深/双/嵌套类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8819102/

相关文章:

c++ - 如何在 Armadillo 中序列化稀疏矩阵并与boost的mpi实现一起使用?

c++ - cmake 添加外部库

c++ - 让 g++ 使用 SHLD/SHRD 指令

java - R - 重新格式化列表

c++ - 容器类和继承调用虚方法

c++ - 调用 SDL_RenderCopy 时出现异常

C++ 文件选择窗口

c++ - to_string() 在 NaN 情况下可以返回什么

c++ - 在 MFC 中的运行时更改编辑框属性

linux - 了解事件是否发生(运行 gtk_dialog_run() 时)