我们是不是需要显式使用指针类型的 CTOR?
Posted
技术标签:
【中文标题】我们是不是需要显式使用指针类型的 CTOR?【英文标题】:Do we need explicit for CTOR with pointer type?我们是否需要显式使用指针类型的 CTOR? 【发布时间】:2015-11-18 02:09:55 【问题描述】:在这种情况下我们是否需要explicit
:
class A
explicit A(B* b);
;
我认为即使我们不将构造函数标记为explicit
,写出来也会是编译错误:
A a = new B();
从指针到对象的隐式转换根本不可能通过构造函数实现,对吧?
【问题讨论】:
【参考方案1】:我们需要显式的指针类型的 CTOR 吗?
如果您在团队中工作,这取决于您和您的团队。它更像是一个编码指南,而不是其他任何东西。语言没有强制要求。
【讨论】:
你的意思是,我在写,编译器无论如何都会捕捉到错误的转换,对吧? 听起来@UpAndAdam 说A a = new B();
没有explicit
是正常的,而你说即使没有explicit
也不会编译。
@Narek,不,我不是这么说的。 UpAndAdam 说的是正确的。【参考方案2】:
编译将失败 从B*
到A
的转换将失败。
这正是显式将阻止的事情。
在这种情况下你应该只写A a( new B() );
,或者如果你想变得更详细,你可以写A a = A( new B() );
至于根本问题:您是否需要它取决于您和您的团队。通常一个主要问题是:你是否会有一个'int'构造函数(会导致与 * 类型的歧义),你想要发生什么,你是否希望从构造参数发生隐式转换。
【讨论】:
我的答案的顶部是针对如果您确实使用explicit
关键字该怎么办。如果没有explicit
,您可以执行上面的操作,并且不会出错。【参考方案3】:
如果您不希望该构造函数可用于隐式转换,您确实需要explicit
。完全有可能让基于构造函数的隐式转换接受指针。
【讨论】:
删除explcit
会编译哪些情况。例如A a = new B();
即使没有explicit
也无法编译。以上是关于我们是不是需要显式使用指针类型的 CTOR?的主要内容,如果未能解决你的问题,请参考以下文章