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:「否則,兩個指針都不會比另一個更大」 –