#cpp #cpp11 #constexpr
Нужен указатель на адрес 0xFFFF FFFF FFFF FFFF, или на -1. Пытаюсь определить как constexpr auto hInvd = reinterpret_cast(-1ul);, но вываливается ошибка, что это не константное выражение. Очевидно из-за reinterpret_cast. К сожалению, другие *_cast тоже не дают ничего полезного. Простой const работает без проблем const auto hInvd=reinterpret_cast (-1ul); Мне нужен указатель на область памяти, которая будет свободна. nullptr для этого не годится, так как нулевой адрес может быть использован, а вот вероятность использования адреса 0xFFFFFFFFFFFFFFFF практически равна нулю.
Ответы
Ответ 1
Конвертировать любую целочисленную константу в указатель на constexpr невозможно, т.к. для этого используется reinterpet_cast, который прямо запрещён в описании константных выражений ([expr.const]). Почему так? Потому что constexpr всегда является чем-то определённым и не может дать на выходе неопределённое поведение. Если бы можно было случайный адрес привести к указателю на constexpr, тогда получилось бы, что его использование (разыменовывание) может приводить к UB.Ответ 2
Как выяснилось, этот ответ - баг компилятора :) Ну, gcc сожрал финт с вычитанием единицы из нулевого указателя, правда, только через промежуточную переменную: https://ideone.com/Hp6DNt #includeusing namespace std; int main() { constexpr void *p = nullptr; constexpr void *res = p - 1; cout << res << endl; return 0; }
Комментариев нет:
Отправить комментарий