Могу ли я иметь указатель на указатель на 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 *
,