¿Es legal verificar si la dirección de un subobjeto se encuentra dentro de los límites de un objeto que contiene

2 preguntas:

¿El siguiente código está bien formado con un comportamiento definido?

¿Hay alguna implementación posible de c ++ en la que se pueda afirmar?

Código (c ++ 11 y 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()));
}

Tenga en cuenta quea yb tener diferentes especificadores de acceso.

Respuestas a la pregunta(1)

Su respuesta a la pregunta