преобразование типов — Могу ли я иметь указатель на указатель на 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.

4

Другие решения

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

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 *,

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector