1

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

4

2 回答 2

1

operator T()返回一个用 初始化的 T 列表x,y,z。这意味着 的重载DoSomething在采用 2 个向量的一方或采用向量的一方和 之间是不明确的double*

因此,如果您在调用站点将第二个参数转换为您想要的类型,您将明确告诉编译器要采用什么重载。

std::enable_if基本上消除了使用三个 s 无法构造的重载,这double意味着它消除了歧义,因此它可以编译。

您的向量可以用三个doubles 构建。

Vector(double x, double y, double z)
于 2013-08-07T10:39:21.360 回答
1

没有enable_if,您的转换运算符适用于每种类型。如果尝试为无法从 构造的类型实例化转换运算符,则会出现错误{x, y, z},但这不会改变运算符存在的事实。因为它存在,所以该类型被认为可转换为double *,并且重载决议无法选择最佳匹配。

于 2013-08-07T10:42:22.497 回答