¿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.