Оператор wchar_t ** () не может обеспечить неявное преобразование в const wchar_t ** - почему? - PullRequest
3 голосов
/ 10 января 2012

У меня проблема с пониманием того, почему неявное преобразование не работает так, как я этого ожидаю.У меня есть следующий класс

ref class ManagedWStringArrayWrapper
{
    wchar_t** m_pointer;

public:

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

, и я думал, что это также неявно преобразуется в const wchar_t ** - но это не так.Может кто-нибудь сказать мне, почему?

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Преобразование из T** в T const** не так интуитивно понятно, как вы могли бы ожидать - на самом деле, оно приведено в качестве примера в самом стандарте как const -неверный код.

В приведенном примереis:

#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*.Совсем нет!

Я задал тот же вопрос в сообщении в блоге , а в FAQ есть запись .

0 голосов
/ 10 января 2012

Потому что это разные вещи. Если вы посмотрите, например, на библиотеки C ++, вы обнаружите, что часто есть две функции, выполняющие одно и то же: одна работает с константными указателями, а другая - неконстантными. Пример.

Но вы можете легко добавить явный оператор const wchar_t**.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...