2012-01-10 57 views
3

我有一个问题,理解为什么某个隐式转换不能像我期望的那样工作。我有以下类运算符wchar_t **()未能提供向const的隐式转换wchar_t ** - 为什么?

ref class ManagedWStringArrayWrapper 
{ 
    wchar_t** m_pointer; 

public: 

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

我想这也会隐式转换为常量wchar_t ** - 但它不会。有人能告诉我为什么吗?从T**T const**

+0

你能否提供一个你如何使用该操作符的示例? – 2012-01-10 10:57:17

+1

关于此问题,C++常见问题解答有一个条目:http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 – 2012-01-10 10:57:17

+0

+1这很有趣。对于单层间接寻址(wchar_t *),const wchar_t *()运算符允许隐式转换。它仅在失败时出现多层间接寻址。 Joys of C++。 – adelphus 2012-01-10 11:07:03

回答

3

转换不是那么直观,你可能会想到—事实上,它给在标准本身const -incorrect代码的例子。

给出的例子是:

#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中的同一个问题,FAQ也有an entry on it

+0

同样,你不能隐式地将'Derived **'转换为'Base **'。同样的原因,因为如果你可以接着'派生* pd,** ppd = &pd; Base ** ppb = ppd; * ppb = new Base;'会导致'pd'包含一个指向'Base'对象的指针,没有来自类型系统的反对,也没有显式强制转换来警告读者一些不安全的事情正在进行。 – 2012-01-10 12:48:11

0

因为这些是不同的东西。例如,如果你看一下C++库,你会发现通常有两个函数可以做同样的事情,一个在const指针上操作,另一个在非const上操作。 Example.

但是你可以很容易地添加一个明确的运算符const wchar_t**

+0

在行之间阅读@Mr Lister - 如果添加常量wchar_t **操作符(你是否甚至费心去尝试?),除非显式强制返回值,否则它将失败。问题是为什么? – adelphus 2012-01-10 11:04:04

+0

不是,原因不一样。如果将转换添加到'wchar_t *',它可以隐式转换为'wchar_t const *'。 – 2012-01-10 11:11:07

+0

是的,我困扰着尝试。它编译。要我发布我的源代码? – 2012-01-10 11:16:33