Как брошенному указателем Foo ** к константе Foo ** в C++

Сам

  • Никакой реальный браузер кода, вместо этого сотни маленьких суетящихся окон.
  • Только исследовательский проект, не достаточно стабильный, никакое активное сообщество.
  • Никакая прилично быстрая версия для Linux или Windows. Только Mac OS X.
  • Никакая поддержка команд стандартной клавиатуры.
  • , О! И документация относительно записи собственных плагинов таким образом устаревшая!
7
задан 25 August 2009 в 16:54
поделиться

6 ответов

Вы хотите const_cast .

3
ответ дан 6 December 2019 в 06:03
поделиться

Это должно сработать:

Foo** f;
const Foo** cf = const_cast<const Foo**>(f);
17
ответ дан 6 December 2019 в 06:03
поделиться

Вы не должны этого делать. Тот факт, что вы не можете легко выполнить преобразование, заключается в том, что оно нарушает постоянную правильность (и ваш код выполняет это). Используя приведенные выше рекомендации, ваш код будет компилироваться и вызывать метод изменения для константного объекта (последняя строка кода).

Это не рекомендуется, а в некоторых редких случаях может даже убить ваше приложение (постоянный глобальный объект может быть сохранен на странице памяти, доступной только для чтения) или оставьте ее в нестабильной ситуации (вы изменяете внутреннее состояние объекта, изменяя постоянную ссылку на внутренний элемент-член, нарушая инварианты объекта).

О вашей проблеме: C ++ FAQ Lite [18.17]

0
ответ дан 6 December 2019 в 06:03
поделиться

Это не очень хорошая идея, потому что это нарушает безопасность типов. Позвольте мне объяснить, почему:

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!
10
ответ дан 6 December 2019 в 06:03
поделиться

Почему бы вам просто не сделать:?

const Fred** q1;
*q1 = p1;

Или вы хотите исключить нарушение константности без const_cast? -- нет, сэр,

1
ответ дан 6 December 2019 в 06:03
поделиться

вам не нужно выполнять преобразование для const Fred ** q1 = & p1 как неконстантного Fred ** может быть напрямую присвоено const Fred ** q1 в его объявлении.

-1
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: