为什么没有enable_if就不能编译?

时间:2013-08-07 10:34:29

标签: c++

如果删除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

2 个答案:

答案 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 *,并且重载决策无法选择最佳匹配。