ConstexPR смещение с указателем на данные членаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 ConstexPR смещение с указателем на данные члена

Сообщение Anonymous »

Непосредственно перед тем, как этот вопрос был отклонен за то, что он является дубликатом, большинство (если не все) вопросов приняли принятые ответы с устаревшими /неопределенными решениями поведения. < /p>

Вопрос. : < /h3>

Есть ли способ получить, с компиляцией, смещение указателя на данные члена: < /p>
  • не полагается на неопределенное поведение ( вещи)
  • Работает над последней версией GCC (The GCC Trunk в компиляторе Explorer)
  • Работает одинаково как смещение (или аналогично, как и предлагаемый код).
Мне не волнует:


Не стандартные типы < /li>
Совместимость MSVC. (Это может быть хорошо, но необязательно) < /li>
Имея особый случай для конкретного компилятора < /li>
< /ul>

Проблема: < /h3>

С версией GCC багажника, следующий трюк (Hack) не работает: < /p>

Код: Выделить всё

#include 
#include 

namespace detail
{
// The union stuff is for CLang to avoid creating warnings
template
struct offsetof_ptr_helper
{
union helper_t { int i = 0;  T value; };
static constexpr helper_t v = {};
static constexpr size_t sz = sizeof
(uint8_t[
(uint8_t *)&(v.value.*MPtr) -
(uint8_t *)&v.value
]);
};
}

template
static constexpr size_t offsetof_ptr()
{
return detail::offsetofptr_helper::sz;
}

size_t f()
{
struct X { char c[10]; int a; };
return offsetof_ptr();
}
< /code>

Чтобы быть ясным, это взлом с использованием функций C ++ 98, и это не очень удивление, что его поддержка удаляется новейшими компиляторами. Он работает на Clang (используя -std = gnu ++ 17 
flag) и GCC (включая/op -to g ++ 7.3 с использованием флага -std = c ++ 17 ).

Подробнее здесь: https://stackoverflow.com/questions/500 ... ember-data
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»