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!!!
{}
}