Сам
Это должно сработать:
Foo** f;
const Foo** cf = const_cast<const Foo**>(f);
Вы не должны этого делать. Тот факт, что вы не можете легко выполнить преобразование, заключается в том, что оно нарушает постоянную правильность (и ваш код выполняет это). Используя приведенные выше рекомендации, ваш код будет компилироваться и вызывать метод изменения для константного объекта (последняя строка кода).
Это не рекомендуется, а в некоторых редких случаях может даже убить ваше приложение (постоянный глобальный объект может быть сохранен на странице памяти, доступной только для чтения) или оставьте ее в нестабильной ситуации (вы изменяете внутреннее состояние объекта, изменяя постоянную ссылку на внутренний элемент-член, нарушая инварианты объекта).
О вашей проблеме: C ++ FAQ Lite [18.17]
Это не очень хорошая идея, потому что это нарушает безопасность типов. Позвольте мне объяснить, почему:
Fred* pFred;
const Fred** ppFred = const_cast<const Fred**>(&p);
*ppFred = new const Fred; // Now pFred points to a const Fred
pFred->some_evil_mutating_method(); // can do, since type of *pFred is non-const!
Почему бы вам просто не сделать:?
const Fred** q1;
*q1 = p1;
Или вы хотите исключить нарушение константности без const_cast? -- нет, сэр,
вам не нужно выполнять преобразование для const Fred ** q1 = & p1
как неконстантного Fred **
может быть напрямую присвоено const Fred ** q1
в его объявлении.