考虑以下代码
namespace std {
struct type1 {/* Definition */};
template <class T> constexpr T operator+(const type1& x1, const T& x);
template <class T> constexpr T operator+(const T& x, const type1& x1);
}
namespace other {
struct type2 {/* Definition */};
template <class T> constexpr T operator+(const type2& x2, const T& x);
template <class T> constexpr T operator+(const T& x, const type2& x2);
}
int main(int argc, char** argv)
{
std::type1 var1;
other::type2 var2;
auto x = var1 + var2; // What will happen here?
}
行auto x = var1 + var2
会发生什么?
这是一个定义的行为吗?
这是否意味着标准库永远不会仅在一侧定义带有模板的通用运算符以避免使用冲突?
答案 0 :(得分:4)
根据depended name look up(a.k.a Koenig Lookup)规则进行了明确定义。除了通常的非限定名称查找所考虑的范围和名称空间之外,编译器还将在operator+
参数的名称空间中查找函数名称。
因此,编译器将向重载集添加匹配的重载运算符(即,来自名称空间std
和other
)。
因此,您会收到一个模糊的通话错误。
答案 1 :(得分:1)
您应该在符合编译器时遇到模糊的运算符错误。 您的程序生成错误,因为两个版本的重载都符合候选条件。
答案 2 :(得分:-1)
此代码导致未定义的行为。除现有模板的显式特化外,不允许将您自己的内容添加到namespace std;
。