更喜欢通过隐式构造函数或隐式转换运算符将一种类型转换为另一种类型?

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适用于任何一种情况。

sig*_*gma 0

两种方法在功能上是等效的,以便让您定义两种类型的转换,即使其中一种类型是您无法修改的类,或者根本不是类,如基本类型。

在隐式情况下,这两个选项都允许您调用f(X1{}),在显式情况下它们都允许f(X2{X1{}})。第二个选项只是直接使用转换构造函数,而第一个选项使用 X2 的复制或移动构造函数,它从转换运算符获取参数。实际的复制或移动操作将被省略,因此性能上没有差异。