Могу ли я иметь указатель на указатель на const в C++?

В основном мне интересно, что-то вроде

f(const void* a){
  // This is also what `(char**) a` would do behind the scenes
  char** string_a_ptr {reinterpret_cast<char**>(const_cast<void*>(a))}; 

  // ...

возможно при сохранении const Классификатор.

Мой вопрос возник во время упражнения о C-массивах в C++. Из-за C мне пришлось передать указатель на функцию с const void* аргументы. В этом случае он указывал на массив C-строк. Чтобы привести его к правильному типу, мне пришлось отбросить констант. Есть ли способ в C++ получить что-то вроде указателя "(const char*)*"`?

Я попробовал const char** (без const_cast), который дает

reinterpret_cast из типа 'const void*' в тип 'const char**' отбрасывает квалификаторы

а также (const*)*, что дает синтаксическую ошибку

ожидаемый спецификатор типа перед токеном '('

Это чисто академический вопрос. Я знаю, что проблема может быть решена проще и безопаснее, используя std::string а также #include <algorithm>,

Несмотря на это, есть ли преимущества иногда использовать C-конструкции в C++ или их всегда следует избегать, если это возможно? Я только выполнил некоторые мелкомасштабные упражнения с кодом C в C++, но это уже вызывает немало головных болей и вынуждает меня внимательно присматриваться, хотя я и написал немало кода на C в своей жизни. Или вы бы рекомендовали использовать extern C классификатор и написание кода C в чистом C?

2 ответа

Решение

Это было бы char* const *,

В двойном указателе есть три места для констант:

const char**

Указатель на указатель на символ, который вы не можете изменить.

char *const *

указатель на указатель, который вы не можете изменить, на символ.

char ** const

указатель, который вы не можете изменить, указатель на символ.

Вы можете смешать их, чтобы сделать разные части const.

Я считаю, что это то, что вы ищете:

const char * const * string_a_ptr = static_cast<const char * const *>(a);

[Живой пример]

Вы могли бы даже бросить первый const если хочешь (и это имеет смысл).

Объяснение:

const void * a Значит это a указывает на что-то (void) который const, Поэтому, если вы разыгрываете a на другой указатель, он также должен указывать на то, что const, В вашем случае вы приводите его к указателю char*, Тот char* поэтому должен быть const, Синтаксис для создания постоянного указателя (не указателя на постоянную) заключается в const справа от *, Следовательно, char* const *,

Другие вопросы по тегам