【发布时间】:2021-10-25 02:49:08
【问题描述】:
我在阅读Explicitly defaulted and deleted special member functions,看到为了只用double 调用函数f 并避免隐式转换,可以这样写(from the same page):
struct OnlyDouble
{
void f(double d);
template<class T> void f(T) = delete;
};
有理由写上面的代码而不是下面的代码吗?
struct OnlyDouble
{
explicit void f(double d);
};
有什么不同,还是有一些我不知道的额外行为?
【问题讨论】:
-
第二个sn-p没有编译......
-
explicit没有按照你的想法做。它只适用于构造函数,并且你的成员函数f不是构造函数。f- 在您的第二个示例中 - 仍然允许将其参数d从可以隐式转换为double的任何内容隐式转换,例如,f(1.3f)和f(17)仍然可以工作。 -
在第一个代码中,
f()只能用double来调用,任何其他类型都会产生错误。在第二个代码中(如果已编译),f()可以用任何可转换为double的类型调用。explicit只能用于构造函数、转换运算符和推导指南,f()不是这些。 -
谢谢。有人可以写一个答案以便我接受和投票吗?