此代码段
#include <stdlib.h>
struct Base { };
template<typename T>
inline bool operator==(const T&, const Base&)
{
return true;
}
template<typename T>
inline bool operator!=(const T& lhs, const Base& rhs)
{
return !(lhs == rhs);
}
struct A : public Base
{
bool operator==(const A&) const { return true; }
};
struct A_1 final : public A { };
int main()
{
const A a;
const A_1 a_1;
if (a_1 != a) {}
return EXIT_SUCCESS;
}
在 C++17 (Visual Studio 2022) 中编译没有错误。(有关更详细的示例,请参阅C++17 operator==() 和 operator!=() 代码在 C++20 中失败;请注意,在这种情况下,代码会编译。)
尝试使用 C++20 构建相同的代码会产生三个编译器错误:
error C2666: 'operator !=': 3 overloads have similar conversions
message : could be 'bool A::operator ==(const A &) const' [rewritten expression '!(x == y)']
message : or 'bool A::operator ==(const A &) const' [synthesized expression '!(y == x)']
message : or 'bool operator !=<A_1>(const T &,const Base &)'
是的,我知道C++20 会综合operator!=
等等......但是现有的 C++17 代码不应该仍然用 C++20 编译吗?如何解决问题,以便相同的代码同时使用 C++17 和 C++20 编译并生成相同的结果?
对派生类进行更改可能很困难,因为该代码可能在其他地方(这实际上是库代码);最好对Base
. _