【发布时间】:2021-05-02 22:15:51
【问题描述】:
我正在尝试在最新的 Visual Studio 和 Clang 版本中测试我的项目。弹出的错误之一与不明确的运算符(with reversed parameter order) 有关。这似乎不会在 C++17 中弹出。
例如:(https://godbolt.org/z/Gazbbo)
struct A {
bool operator==(const A& other) const { return false; }
};
struct B : private A {
B(const A&);
bool operator==(const B& other) const { return false; }
};
bool check(A a, B b) {
return b == a;
}
我不确定为什么这会是一个问题。在我看来,这里唯一可行的函数是bool operator==(const B& other) const,因为A 可以隐式转换为B,但不能反过来。事实上,如果我用explicit 标记B(const A&),我会得到一个错误,即B 无法转换为A 的私有基数。
除了使用explicit 或B(a) 之外,我正在努力了解我可以做些什么来避免这种情况。想象一下A 和B 是库代码,如何在不破坏低版本接口的情况下支持C++20?
【问题讨论】:
-
@Barry 我不确定这是否与飞船操作员有关...如果我用默认飞船替换我的重载,我会得到相同的编译器错误。
-
这与作为宇宙飞船功能的一部分采用的规则有关。
标签: c++ operator-overloading c++20 ambiguous spaceship-operator