在C++中合法存储具有重载"operator&"的类的对象是否合法?

sha*_*oth 6 c++ stl operator-overloading

根据C++ 03 Standard(23.1/3),只有可复制构造的类对象可以存储在STL容器中.可复制构造在20.1.3中描述,并要求"&"产生对象的地址.

现在假设我有这个课程:

class Class {
public:
   Class* operator&()
   {
       //do some logging
       return this;
   }
   const Class* operator&() const
   {
       //do some logging
       return this;
   }
   //whatever else - assume it doesn't violate requierements
};
Run Code Online (Sandbox Code Playgroud)

这个类对象可以合法地存储在STL容器中吗?

Mik*_*our 5

是.在C++ 03中&,给定t类型T和u类型的值的CopyConstructible要求const T是:

  • &t有类型T*,并给出地址t,和
  • &u有类型const T*,并给出地址u.

您的重载运算符具有此行为; 因此,假设该类满足其他CopyConstructible和Assignable要求,则此类型的值可以存储在任何C++ 03容器中.

C++ 11放宽了这些要求,要求这些类型只能在具有这些要求的容器或操作中移动或复制,并删除&必须做的相当奇怪的规范; 所以你的课程仍然很好,再次假设它满足你使用的特定容器和一组操作的所有其他要求.