`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 和更新版本中出现。

以上是`std::variant`的重载&amp;&amp;会破坏不相关的`std::map`的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>