reinterpret_cast с целочисленным литералом не является constexpr - PullRequest
0 голосов
/ 13 января 2019

Код ниже не компилируется ни в gcc, ни в clang. Оба жалуются, что от reinterpret_cast до int* это не constexpr.

Как я могу обойти проблему? Обратите внимание, что я не могу изменить макрос PORT, так как он определен в сторонней библиотеке (avr).

#include <iostream>
#define PORT ((int *)(0x20))
constexpr int *p = PORT;  // does not compile

int main() {
    std::cout << (uintptr_t) p << "\n";
    return 0;
}

1 Ответ

0 голосов
/ 13 января 2019

Проще говоря, если вы не можете изменить PORT, вы не можете указать PORT как constexpr.

A constexpr выражение не может содержать reinterpret_cast. Это неопределенное поведение. Имейте в виду, что приведение в стиле c, например (int*), уменьшено до static_cast или reinterpret_cast, в данном случае reinterpret_cast.

Учитывая ваш пример, я не понимаю, почему вы не просто использовали бы const.

const int *p = PORT;
...