任何人都可以解释为什么以下代码编译?我希望在double
常量3.3
无法转换为int
时会出现错误,因为我将构造函数声明为explicit
。
class A
{
public:
int n;
explicit A(int _n);
};
A::A(int _n)
{
n = _n;
}
int main()
{
A a(3.3); // <== I expect this line to get an error.
return 0;
}
答案 0 :(得分:3)
它以相反的方式工作。我们除了代码之外还要定义
void f(A a)
{
}
int main()
{
A a(3.3); // <== I expect this line to get an error.
f(5);
return 0;
}
如果没有单词 explicit ,它将编译,使用显式它会报告错误。在这种情况下,关键字禁止从整数转换为 A 。
答案 1 :(得分:2)
显式class_name(params)(1)
显式运算符type()(从C ++ 11开始)(2)1)指定此构造函数仅考虑直接初始化(包括显式转换)
2)指定此用户定义的转换函数仅考虑直接初始化(包括显式转换)
在你的情况下,你 使用直接初始化来构造类型为A
的实例:
A a(3.3);
explicit关键字不会阻止编译器将参数从double类型隐式转换为int。它阻止你做这样的事情:
A a = 33;