enum class PType : int
{
Parallel = 0,
AntiParallel = 1,
BiParallel = 2,
NotParallel = 3
};
我现在想创建两个运算符
bool operator==(PType lhs, PType&& rhs) bool operator==(PType&& lhs, PType rhs)
这样我就可以找出我的右值引用位于==的哪一侧。不幸的是我得到了编译器错误
错误C2593:'运算符=='不明确在Visual Studio中,因为编译器会自动生成以下运算符:
bool operator==(const PType lhs, const PType rhs);
为此。尝试使用删除它
bool operator==(const PType lhs, const PType rhs) = delete;
不会在该行中导致编译错误,但此后我仍然会收到“模糊”错误。关于如何进行这项工作的任何想法?
编辑:我知道如何使用常规类来做到这一点,但我仍然想弄清楚为什么编译器会产生错误。我知道该代码是粗略的,不好的样式,并且可能导致许多人提到的错误。无论如何,我有一种想法,认为这种类型的东西可以工作,所以我尝试了一下,我认为如果我只能让“ = delete”工作,它仍然可以工作。因此,现在我出于纯粹的学术兴趣提出这个问题,因为我想了解有关编译器的更多信息,以及为什么删除该函数时编译器未报告任何错误,但随后又抱怨了几行,即所谓的删除函数被视为重载候选。
operator==
将会使必须维护您的代码(包括您自己距今6个月)的所有人感到困惑,并且很可能导致错误很难诊断。当与标准库工具一起使用时,它也可能导致未定义的行为。不过,如果您坚持走这条路,则可以尝试这样声明4个重载:
bool operator==(const PType& lhs, const PType& rhs);
bool operator==(const PType& lhs, PType&& rhs);
bool operator==(PType&& lhs, const PType& rhs);
bool operator==(PType&& lhs, PType&& rhs);
例如,如果左操作数是一个左值,而右操作数是一个右值,那么将选择第二个重载。
您还确实需要:
bool operator==(PType lhs, PType rhs) = delete;
以防止在过载解析期间生成内置的候选签名。