2个问题中:是否合法,检查的子对象的地址是否在包含对象的范围
是有定义的行为也形成了如下的代码?
是否有任何可能的C++实现的,它可以断言?
码(C++ 11和更高):
#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()));
}
注意a
和b
具有不同的访问说明。
“需要注意的是A和B具有不同的可见性。”不。他们有不同的**访问说明符**。对于任何明智的可见性概念而言,两者都是“可见的”。将事物私人化并不会使它们消失。 –
我们在讨论什么对象?他们是否符合任何概念,比如'StandardLayout','POD','TriviallyCopyable'?你到达的越具体,你的答案就越精确。否则,答案可能只能围绕您的示例代码进行,这可能不适用于现实世界的问题。 – Jodocus
以下是它变得有趣的地方:'X y; assert(!is_within_object(y,x.get_a()));'这会触发exp.rel 3.3:“否则,两个指针都不会比另一个更大” –