【发布时间】:2019-08-10 10:53:15
【问题描述】:
给定一个带有多个隐式转换函数(非显式构造函数和转换运算符)的简单类模板,如下例所示:
template<class T>
class Foo
{
private:
T m_value;
public:
Foo();
Foo(const T& value):
m_value(value)
{
}
operator T() const {
return m_value;
}
bool operator==(const Foo<T>& other) const {
return m_value == other.m_value;
}
};
struct Bar
{
bool m;
bool operator==(const Bar& other) const {
return false;
}
};
int main(int argc, char *argv[])
{
Foo<bool> a (true);
bool b = false;
if(a == b) {
// This is ambiguous
}
Foo<int> c (1);
int d = 2;
if(c == d) {
// This is ambiguous
}
Foo<Bar> e (Bar{true});
Bar f = {false};
if(e == f) {
// This is not ambiguous. Why?
}
}
涉及原始类型的比较运算符(bool、int)是模棱两可的,正如预期的那样 - 编译器不知道它是否应该使用转换运算符将左侧模板类实例转换为原始类型或使用转换构造函数将右侧的原始类型转换为预期的类模板实例。
然而,最后一个比较,涉及一个简单的struct,并不模棱两可。为什么?将使用哪个转换函数?
使用编译器 msvc 15.9.7 测试。
【问题讨论】:
-
explicit关键字是个好东西。你应该研究一下。 -
e == f在 C++20 中将是模棱两可的,因为它的价值。
标签: c++ templates c++17 implicit-conversion ambiguous