Из wchar_t** в const wchar_t**
От: ecco Россия  
Дата: 08.12.05 12:50
Оценка:
Есть такой вот код:
static void ProcessVolatText(       wchar_t** pVolatText )    {...}
static void ProcessConstText( const wchar_t** pConstText )    {...}

void Foo
{
    static       wchar_t* pVolatText = { L"aaaaa", L"bbbbb", NULL };
    static const wchar_t* pConstText = { L"ccccc", L"ddddd", NULL };

    ProcessVolatText( pVolatText );    // (1) - OK.
    ProcessConstText( pConstText );    // (2) - OK.
    ProcessConstText( pVolatText );    // (3) - Ошибка компиляции: несоответствие типов.
    
    wchar_t** pVolatTextPtr = pVolatText;
    
    ProcessConstText( pVolatTextPtr );    // (4) - Та же самая ошибка.
}

Компилер (VC7.0) выдаёт соответственно:
error C2664: ...cannot convert ... from 'wchar_t *[3]' to 'const wchar_t ** '
error C2664: ...cannot convert ... from 'wchar_t ** ' to 'const wchar_t ** '

Подскажите, где баг: у меня в голове или в компилере?
Т.е. почему wchar_t* -> const wchar_t* катит, а wchar_t** -> const wchar_t** нет?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Из wchar_t** в const wchar_t**
От: Андрей Россия  
Дата: 08.12.05 13:09
Оценка:
Здравствуйте, ecco, Вы писали:

skip

// 1.
//
static       wchar_t* pVolatText[] = { L"aaaaa", L"bbbbb", NULL };
static const wchar_t* pConstText[] = { L"ccccc", L"ddddd", NULL };

// 2.
//
static void ProcessConstText( const wchar_t* const* pConstText )    {...}
Re: Из wchar_t** в const wchar_t**
От: Кодт Россия  
Дата: 08.12.05 13:42
Оценка:
Здравствуйте, ecco, Вы писали:

E>Подскажите, где баг: у меня в голове или в компилере?

E>Т.е. почему wchar_t* -> const wchar_t* катит, а wchar_t** -> const wchar_t** нет?

Потому что это ломает константность.
Смотри
int const c = 123;

int* pv;
int const* pc = &c;

int** ppv = &pv;
int const** ppc = ppv; // допустим, это было бы возможно
// ppv = ppc = &pv

*ppc = pc; // легально: int const* <- int const*
// pv = pc = &c

*pv = 456; // UB: запись в константу
Перекуём баги на фичи!
Re: Из wchar_t** в const wchar_t**
От: achp  
Дата: 08.12.05 13:45
Оценка:
Здравствуйте, ecco, Вы писали:

E>Т.е. почему wchar_t* -> const wchar_t* катит, а wchar_t** -> const wchar_t** нет?


Потому что иначе можно нарушить константность. Пример здесь
Автор:
Дата: 17.04.03
.
Re: Из wchar_t** в const wchar_t**
От: ecco Россия  
Дата: 10.12.05 12:18
Оценка:
Спасибо, теперь вкурил
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.