'明确' g ++中的关键字对简单构造函数(不是复制/赋值构造函数)没有影响?

时间:2015-12-07 08:53:46

标签: c++ g++

任何人都可以解释为什么以下代码编译?我希望在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;
}

2 个答案:

答案 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;