operator wchar_t **()无法提供对const wchar_t的隐式转换** - 为什么?

时间:2012-01-10 10:53:01

标签: c++ c++-cli

我有一个问题,理解为什么某个隐式转换没有像我期望的那样工作。我有以下课程

ref class ManagedWStringArrayWrapper
{
    wchar_t** m_pointer;

public:

    operator wchar_t**()
    {
        return m_pointer;
    }
};

我认为这也会隐式转换为const wchar_t ** - 但事实并非如此。有人可以告诉我为什么吗?

2 个答案:

答案 0 :(得分:3)

T**T const**的转换并不像您预期​​的那样直观 - 事实上,它在标准本身作为示例给出const - 错误的代码。

给出的例子是:

#include <cassert>  

int main() {  
  char* p = 0;  

  //char const** a = &p; // not allowed, but let's pretend it is  
  char const** a = (char const**)&p; // instead force the cast to compile  

  char const* orig = "original";  
  *a = orig; // type of *a is char const*, which is the type of orig, this is allowed  

  assert(p == orig); // oops! char* points to a char const*  
}

研究上述情况一段时间后,很明显这 与转化T*T const*相同。完全没有!

我在a blog post中提出了相同的问题,常见问题解答也有an entry on it

答案 1 :(得分:0)

因为那些是不同的东西。例如,如果你看一下C ++库,你会发现通常有两个函数用于执行相同的操作,一个用于const指针,另一个用于非const。 Example.

但您可以轻松添加显式运算符const wchar_t**