删除全局隐式函数-避免歧义运算符[关闭]

问题描述 投票:0回答:1
假设我有一个枚举类:

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”工作,它仍然可以工作。因此,现在我出于纯粹的学术兴趣提出这个问题,因为我想了解有关编译器的更多信息,以及为什么删除该函数时编译器未报告任何错误,但随后又抱怨了几行,即所谓的删除函数被视为重载候选。

c++ compiler-errors rvalue
1个回答
2
投票
我认为您不应该这样做。为返回值取决于参数的值类别的枚举编写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;

以防止在过载解析期间生成内置的候选签名。

© www.soinside.com 2019 - 2024. All rights reserved.