Есть такой вот код:
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>>
Здравствуйте, 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 ) {...}
Здравствуйте, 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: запись в константу
Здравствуйте, ecco, Вы писали:
E>Т.е. почему wchar_t* -> const wchar_t* катит, а wchar_t** -> const wchar_t** нет?
Потому что иначе можно нарушить константность.
Пример здесьАвтор:
Дата: 17.04.03
.
Спасибо, теперь вкурил
... << RSDN@Home 1.1.4 beta 7 rev. 447>>