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防止其可调用,例如:
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};\nRun Code Online (Sandbox Code Playgroud)\n\n如果代码尝试以任何方式调用已删除的内容operator==,编译将失败并显示错误消息,例如:
\n\n错误:使用已删除的函数 \xe2\x80\x98bool ID_Record::operator==(const ID_Record&) const\xe2\x80\x99
\n
另一方面,如果您只是operator==完全省略,例如:
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};\nRun Code Online (Sandbox Code Playgroud)\n\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
编译器不会为您生成默认值,除非您在 C++20及更高版本中operator==明确要求它。= default
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |