Pos*_*elf 8 c++ constructor conversion-operator implicit-conversion implicit-constructor
假设我们有程序void f(X2);
。进一步假设我们有类型X1
并且X2
不共享继承层次结构。
我们想这样称呼它:f(X1{})
并X1
隐式转换为X2
. 我们有两种选择来实现这一目标:
struct X2 {};
struct X1 { operator X2(); };
Run Code Online (Sandbox Code Playgroud)
struct X1 {};
struct X2 { X2(const X1&); };
Run Code Online (Sandbox Code Playgroud)
在实现方面,两者之间在定义顺序和访问私有数据的方式方面存在实际差异。
但从用户的角度来看,这两种方法是否会表现出不同的情况?如果是这样,两者中哪一个更可取?
即使我们对两者都进行标记,这个问题仍然是一样的explicit
。然后出现的一个区别是,通过构造函数的转换仅在前一种情况下可用,但static_cast
适用于任何一种情况。
两种方法在功能上是等效的,以便让您定义两种类型的转换,即使其中一种类型是您无法修改的类,或者根本不是类,如基本类型。
在隐式情况下,这两个选项都允许您调用f(X1{})
,在显式情况下它们都允许f(X2{X1{}})
。第二个选项只是直接使用转换构造函数,而第一个选项使用 X2 的复制或移动构造函数,它从转换运算符获取参数。实际的复制或移动操作将被省略,因此性能上没有差异。
归档时间: |
|
查看次数: |
196 次 |
最近记录: |