我最近发现一个大型项目在全局作用域下的一个经常被引用的头文件中使用了"
using namespace std::rel_ops;
"。遗憾的是,这会导致问题,因为这两个函数模板声明变得模糊不清:namespace std::rel_ops {
template <class T>
bool operator!=(const T&, const T&);
}
namespace std {
template <class... TTypes, class... UTypes>
constexpr bool operator!=(const tuple<TTypes...>&, const tuple<UTypes...>&);
}
因此,我尝试使用类似于 std::tie(a.m1, a.m2, a.m3) != std::tie(b.m1, b.m2, b.m3)
的表达式是无效的。
因此计划删除using namespace std::rel_ops;
,然后修复由此产生的编译器错误,可能是通过定义更具体的比较操作符函数来实现的。但我还想评估一下,在不导致编译器错误的情况下,这种更改是否会改变项目中其他某个隐藏代码的含义。
在什么条件下,如果有的话,在带有指令using namespace std::rel_ops;
和不带指令的两个C++程序之间可能有不同的行为,假设都没有必须的诊断?
我怀疑这需要另一个比std :: rel_ops
中的运算符函数模板不太特殊化的比较运算符函数模板,并且其有效行为与 std :: rel_ops
的定义不同。在一个真实的项目中,这两个条件似乎都很不可能同时存在。
using namespace
可能会导致各种奇怪的错误。 - bartoprel_ops
中,没有比任何潜在的声明更糟糕的重载了,对吧? - ascheplertemplate <typename T, typename U> bool operator==(const T&, const U&)
可以吗? - L. F.