Какая польза от метода init ()?

Кланг прав. Результат реинтерпрет-литья никогда не является постоянным выражением (см. C ++ 11 5.19 / 2).

Цель константных выражений состоит в том, что они могут быть аргументированы как значения, а значения должны действительны. То, что вы пишете, не является допустимым указателем (поскольку это не адрес объекта или связанный с адресом объекта по арифметике указателя), поэтому вам не разрешено использовать его в качестве постоянного выражения. Если вы просто хотите сохранить номер 1, сохраните его как uintptr_t и сделайте реинтерпрет на используемом сайте.


. В стороне, чтобы немного поразмыслить над понятием «действительные указатели», рассмотрите следующие указатели constexpr:

int const a[10] = { 1 };
constexpr int * p1 = a + 5;


constexpr int b[10] = { 2 };
constexpr int const * p2 = b + 10;

// constexpr int const * p3 = b + 11;    // Error, not a constant expression

// static_assert(*p1 == 0, "")           // Error, not a constant expression

static_assert(p2[-2] == 0, "");          // OK

// static_assert(p2[1] == 0, "");        // Error, "p2[2] would have UB"

static_assert(p2 != nullptr, "");        // OK

// static_assert(p2 + 1 != nullptr, ""); // Error, "p2 + 1 would have UB"

Оба p1 и p2 являются постоянными выражениями. Но независимо от того, является ли результат арифметики указателя постоянным выражением, зависит от того, не является ли это UB! Подобное рассуждение было бы существенно невозможным, если бы значения констант reinterpret_casts были постоянными.

0
задан mubeen 25 February 2015 в 14:55
поделиться