gpt4 book ai didi

c++ - 在什么情况下全局运算符隐藏在 C++ 中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:17 25 4
gpt4 key购买 nike

我正在重新安排相对较大的 C++ 项目中代码的命名空间。我一直遇到的一个困难是全局运算符重载有时变得不可访问。诸如流运算符(<< 和 >>)和相等运算符 (==) 之类的东西,有时导致这种情况的唯一变化是从说“namespaceA”移动到“parent::namespaceA”。命名空间“parent”已经存在。

我可以通过显式添加来解决这些问题:

using ::operator<<;
using ::operator>>;
using ::operator==;

在受影响的文件中(来自“namespaceA”),尽管看到这项工作我有些惊讶。

但这感觉就像我只是在某个地方掩盖了一个更深层次的问题。

所以我的问题是:您预计会在哪些情况下屏蔽/隐藏全局运算符?

注意:我怀疑可能是嵌套的命名空间阻止了 Koenig Lookup 执行它的操作,但制作一些测试用例表明这不是问题所在。另一个潜在的突出点是受影响的重载全局运算符似乎都是模板函数。但是,我有兴趣更好地了解全局命名空间运算符是如何以某种方式消失的……感谢所有答案。

显然它与父命名空间有关,但我不完全确定我在寻找什么。我可以理解运算符再次被重载以致于调用了错误的版本,但我遇到了编译错误,甚至无法找到具有正确签名的运算符!

最佳答案

您可能忘记了名称查找的工作原理。当您使用 operator<< 时, 它几乎总是 a << b , 不是 ::parent::namespaceA::operator<<(a,b) .不合格的使用意味着它是通过参数相关查找(又名 Koenig 查找)查找的。

因此,来自全局命名空间的运算符将被来自参数命名空间的运算符隐藏。

关于c++ - 在什么情况下全局运算符隐藏在 C++ 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6531575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com