在编译时阻塞运算符 ==()

Tho*_*ews 0 c++ operator-overloading runtime-compilation

我有一个 ID-Record 类,我想阻止调用者/用户使用运算符==,因为它不明确(用户可能只想比较数据字段是否相等)。

这是我的班级:

#include <string>
#include <functional>

class ID_Record
{
  public:
    bool operator==(const ID_Record& other) const
        {  throw std::bad_function_call(); }
    unsigned int id;  // Record ID used for database.
    std::string  value;
};
Run Code Online (Sandbox Code Playgroud)

我更喜欢operator==()在编译时“阻止”,这样编译器就可以捕获它而不是在运行时捕获它。

编译器应该为此代码生成错误:

ID_Record a(6, "Tree");
ID_Record b(3, "Platinum");
if (a == b) std::cout "Records are equal\n"; // This line should fail compilation.
Run Code Online (Sandbox Code Playgroud)

我也想阻止编译器生成的功能的情况。

Rem*_*eau 11

从 C++11 开始,您可以显式声明任何类方法/运算符以= delete防止其可调用,例如:

\n
class ID_Record\n{\n  public:\n    bool operator==(const ID_Record& other) const = delete;\n    unsigned int id;  // Record ID used for database.\n    std::string  value;\n};\n
Run Code Online (Sandbox Code Playgroud)\n

在线演示

\n

如果代码尝试以任何方式调用已删除的内容operator==,编译将失败并显示错误消息,例如:

\n
\n

错误:使用已删除的函数 \xe2\x80\x98bool ID_Record::operator==(const ID_Record&) const\xe2\x80\x99

\n
\n

另一方面,如果您只是operator==完全省略,例如:

\n
class ID_Record\n{\n  public:\n    bool operator==(const ID_Record& other) const = delete;\n    unsigned int id;  // Record ID used for database.\n    std::string  value;\n};\n
Run Code Online (Sandbox Code Playgroud)\n

在线演示

\n

然后你还会得到一个(不同的)编译错误,例如:

\n
\n

错误:与 \xe2\x80\x98operator==\xe2\x80\x99 不匹配(操作数类型为 \xe2\x80\x98ID_Record\xe2\x80\x99 和 \xe2\x80\x98ID_Record\xe2\x80\x99)

\n
\n

编译器不会为您生成默认值,除非您在 C++20及更高版本中operator==明确要求它。= default

\n