-->

从一个数据成员,这是一个单次使用的嵌套类中获得的非POD对象的地址(Get address of a

2019-07-30 20:16发布

我会用一些代码开始:

class myNonPODClass
{
public:
    virtual ~myNonPODClass() {}
    class
    {
    public:
        myNonPODClass* GetContainer()
        {
            return (myNonPODClass*)((int8_t*)(this) - offsetof(myNonPODClass, member));
        }
    } member;
};

显然,这是一个人为的例子。 代码编译好,但我担心的是“对非POD类型‘myNonPODClass’胶印”。 有没有更好的办法基本上做同样的事情,而不必到myNonPODClass指针传递到嵌套的匿名类构造函数(或类似)? “会员”必须准备好去没有任何初始化。 可能吗? 谢谢!

如果你想知道我可以想这个对,我的财产宏观和引擎收录一个注释掉的例子(是的,它的真棒^^)地球上什么: http://pastebin.com/xnknf39m

Answer 1:

此代码不能正常工作,按照C ++规范,有以下几个原因:

  1. offsetof需要POD类型(在C ++ 11,它需要一个标准布局类型)。 您的类型不是,因此调用它导致不确定的行为。
  2. 转化为int8_t* ,然后为另一种类型是每C ++规范未定义的行为。 您将需要使用char* ,具有一定的宽松铸造规则。


文章来源: Get address of a non-POD object from within a data member, which is a single-use nested class