`std::variant`的重载&&会破坏不相关的`std::map`
(这个问题最初是由俄罗斯 SO的另一位用户提出的。我在此处重新发布并稍作更改,以增加曝光率。)
考虑这个代码:
#include <map>
#include <variant>
void operator&&(std::variant<int>, std::variant<int>) {}
int main()
{
std::map<int, int> vals;
vals.find(42);
}
#include <map>
#include <variant>
void operator&&(std::variant<int>, std::variant<int>) {}
int main()
{
std::map<int, int> vals;
vals.find(42);
}
Clang(使用 libstdc++ 和 libc++)和 MSVC 编译它没有问题。
Hovewer、GCC 11.1 和更新版本(包括主干)给出了这个: Run on gcc.godbolt.org
这里发生了什么?
编辑:
我们的operator==重载对于名称查找应该是不可见的<variant>(除了 ADL,这里不涉及),所以这绝对是一个 GCC 错误。
@rustyx 发现GCC 错误 #51577,看起来非常相似。但是还有更多,因为该错误是在 GCC 4.7.0 中引入的,而上面的代码仅在 11.1 和更新版本中出现。
THE END
二维码