É legal verificar se o endereço de um subobjeto está dentro dos limites de um objeto que contém

2 perguntas:

O código a seguir está bem formado com comportamento definido?

Existe alguma implementação possível de c ++ na qual ela possa afirmar?

Código (c ++ 11 e superior):

#include <cassert>
#include <utility>
#include <ciso646>

template<class T> 
auto to_address(T* p) { return reinterpret_cast<unsigned char const*>(p); }

/// Test whether part is a sub-object of object
template<class Object, class Part>
bool is_within_object(Object& object, Part& part)
{
    auto first = to_address(std::addressof(object)),
                 last = first + sizeof(Object);

    auto p = to_address(std::addressof(part));

    return (first <= p) and (p < last);
}

struct X
{
    int a = 0;

    int& get_a() { return a; }
    int& get_b() { return b; }
private:

    int b = 0;
};

int main()
{
    X x;

    assert(is_within_object(x, x.get_a()));
    assert(is_within_object(x, x.get_b()));
}

Observe quea eb tem especificadores de acesso diferentes.

questionAnswers(1)

yourAnswerToTheQuestion