Этот код является недопустимым, поскольку отсутствует "неявное преобразование" для сопоставления с &int_ptr
на double_ptr
, где "неявное преобразование" определяется как нечто:
Выполняется всякий раз, когда выражение некоторого типа T1
используется в контексте, который не принимает этот тип, но принимает какой-либо другой тип T2
; особенно:
- когда выражение используется в качестве аргумента при вызове функции, которая объявлена с
T2
в качестве параметра;
- когда выражение используется в качестве операнда с оператором, который ожидает
T2
; при инициализации нового объекта типа T2
, включая оператор return в функции, возвращающей T2
;
- когда выражение используется в операторе switch (
T2
— целочисленный тип);
- когда выражение используется в операторе if или цикле (
T2
— логическое значение). Программа правильно сформирована (компилируется) только в том случае, если существует одна однозначная неявная последовательность преобразования из T1
в T2
.
Я первоначально предложил использовать reinterpret_cast
, но это также не будет работать, так как использование результата reinterpret_cast
между типами допустимо только в том случае, если типы различаются только тем, подписаны ли они, приведение типа to — это byte*
, char*
или unsigned char*
, или типы являются "похожими", которые определяются как:
- они одного типа; или же
- они оба являются указателями, и типы, на которые указывают, похожи; или же
- они оба являются указателями на член одного и того же класса, и типы членов, на которые указывают, аналогичны; или же
- они оба являются массивами одинакового размера или оба массива с неизвестной границей, и типы элементов массива похожи.
Как видите, ни одна из этих ситуаций не применима к желанию выполнить приведение с адреса int* int_ptr
к double* double_ptr
. Мне трудно предсказать, как вы будете использовать этот тип приведения в строго типизированном языке, но, возможно, void*
это то, что вы ищете? Он может указывать на любой допустимый int**
, и в этом случае вы можете инициализировать его следующим образом: const void* ptr = reinterpret_cast<void*>(&int_ptr)
или действительный double*
, и в этом случае вы должны инициализировать его следующим образом: const void* ptr = reinterpret_cast<void*>(double_ptr)
. Конечно, чтобы использовать ptr
, вам понадобится переменная, указывающая, какой тип она содержит, например:
if(is_int) {
// recover int** (reinterpret_cast<const int* const*>(ptr)) and operate on it
} else {
// recover double* (reinterpret_cast<const double*>(ptr)) and operate on it
}
Живой пример
Здесь я должен признать, что этот ответ несколько надуман. Лучшим решением везде, где используется этот код, скорее всего, будет шаблон.
person
Jonathan Mee
schedule
08.04.2019
double_ptr = &double_num
? - person Jonathan Mee   schedule 08.04.2019