class Attr
{
public:
   Attr();
   Attr(const std::wstring& name)
   {
      ...
   }
};

class AttrDec : public Attr
{
public:
   AttrDec(Attr* attr)
      :Attr()
   {
      _attr = attr;
   }
   AttrDec(Attr*&& attr)
      :Attr()
   {
      _attr = std::move(attr);
   }

private:
   Attr* _attr;
};

class XAttr : public AttrDec
{
public:
   XAttr(const std::wstring& name)
      :AttrDec(&Attr(name)) //HERE!!!
   {}
}


在标记的位置,我得到了警告:


  使用非标准扩展名:类rvalue用作左值。


但是我在类AttrDec中定义了move构造函数!

如何解决此警告?

最佳答案

解决此问题的正确方法是按值存储,然后移动执行其操作。移动指针不会移动仍会消失的基础临时值,并且您将有一个悬空的指针移动到任何地方:

class Attr
{
public:
   Attr();
   /*explicit depending on needs*/ Attr(const std::wstring& name)
   {
      ...
   }
}

class AttrDec : public Attr
{
public:
   AttrDec(Attr attr)
      :Attr()
      , attr_(attr)
   {
   }
   AttrDec(Attr&& attr)
      :Attr()
      , attr_(std::move(attr))
   {
   }

private:
   Attr attr_;
}

class XAttr : public AttrDec
{
public:
   XAttr(const std::wstring& name)
      : AttrDec(Attr(name)) //HERE!!!
   {}
}

07-24 09:27