当用于标准布局类型时,c++ 宏offsetof
只是定义的行为。据我了解,这是因为编译器可以根据其运行的代码的上下文更改数据的内存布局。(例如,当一个变量从不使用时)
但是,我想知道存储在一个范围中的所有元素是否共享相同的布局。或者,换句话说,如果以下代码定义明确:
template<typename T>
concept has_member_int = requires(const T& x)
{
{ x.member } -> std::same_as<int>;
};
template <std::ranges::Range Range_t, has_member_int T>
void setEveryMemberTo20(Range_t<T> range)
{
if (range.size() > 0)
{
auto& firstElement = *(range.begin());
auto ptrdiffToMember = &(firstElement.member) - &firstElement;
for (auto& element : range)
{
*(reinterpret_cast<int*>(&element + ptrdiffToMember)) = 20;
}
}
}