为什么构造函数上的显式说明符不能防止向上转换?

时间:2014-06-23 15:12:34

标签: c++ c++11

我可能误解了explicit说明符。但是为什么以下代码会编译?

struct A {
};

struct B : A {
};

struct C {
  A* a_;
  explicit C(A* a) : a_(a) { }
};

int main() {
  B b;
  C c(&b);
}

使用C调用基类B*构造函数,该A*隐式向上转换为explicit。我以为explicit说明符是为了防止隐式转换参数?

我问,因为我理解将{{1}}说明符添加到单个参数构造函数是一个好习惯,我想检查我的编译器是不是让我做了一些我不应该做的事情

2 个答案:

答案 0 :(得分:9)

explicit阻止构造函数本身用作其他表达式的隐式转换。它不会阻止您在调用时使用隐式转换。

没有办法阻止编译器执行从一种基本类型到另一种基本类型的特定转换(指针是基本类型)。

答案 1 :(得分:2)

正如Sneftel指出的那样,explicit只能阻止构造函数本身被隐式使用。举个例子:

void testFunc(C c) {
    //do stuff
}

int main {
    A a;
    testFunc(&a);
}

不适用于explicit关键字。但是,如果删除它,编译器将隐式调用以C为参数的&a构造函数并运行代码。