Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Как заставить работать constexpr с указателем на -1?

#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 #include using namespace std; int main() { constexpr void *p = nullptr; constexpr void *res = p - 1; cout << res << endl; return 0; }

Комментариев нет:

Отправить комментарий