如果删除enable_if,为什么以下代码无法编译?
template<class T, class = typename std::enable_if<
std::is_constructible<T, double,double,double>::value
>::type >
operator T() const
{
return T{x, y, z};
}
示例代码: 使用enable_if http://ideone.com/nWdmJh
没有enable_if +编译错误 http://ideone.com/FBMamF
答案 0 :(得分:1)
您的operator T()
会返回使用x,y,z
初始化的T列表。这意味着DoSomething
的重载在采用2个向量的向量或采用向量的向量与double*
之间是不明确的。
因此,如果您将第二个参数在调用站点转换为您想要的类型,您将明确地告诉编译器需要执行哪些重载。
std::enable_if
基本上删除了使用三个double
不可构造的重载,这意味着它消除了歧义,因此它编译。
您的矢量可以构造为三个double
。
Vector(double x, double y, double z)
答案 1 :(得分:1)
如果没有enable_if
,则您的转换运算符适用于所有类型。如果尝试为无法从{x, y, z}
构造的类型实例化转换运算符,则会出现错误,但这不会更改运算符存在的事实。因为它存在,所以类型被认为可以转换为double *
,并且重载决策无法选择最佳匹配。