我知道通常 C 风格的转换被认为是有害的。所以,给定一个类 Widget
class Widget{
public:
explicit Widget(Gizmo gizmo);
};
我可以这样调用一个函数:
functionThatTakesAWidget((Widget) gizmo);
使用 C 风格的转换。或者我可以使用函数式转换来编写它:
functionThatTakesAWidget(Widget(gizmo));
但这完全等价。所以没有好坏之分。如果我真的想避免 C 风格的转换,我可以这样写:
functionThatTakesAWidget(static_cast<Widget>(gizmo));
但是给定一个类Doohickey
:
class Doohickey {
public:
Doohickey(Gizmo left_gizmo, Gizmo right_gizmo);
};
我无法避免写作:
functionThatTakesADoohickey(Doohickey(left_gizmo, right_gizmo));
我认为这根本不被视为“类型转换”?但是这和函数式转换有什么区别呢?为什么这样可以,但函数式转换不行?
最佳答案
避免 C 风格转换的原因是:
- 明确说明发生了何种类型的转换,从而确保实际上没有其他类型发生。
- 让 Actor 更容易找到。
虽然函数式转换看起来更安全,但它实际上是变相的 C 式转换,因此它并没有真正添加任何东西。
显式背后的驱动原因是让编译器断言您的假设,而不是默默地(有时)做错事。
恕我直言,一些纯粹主义者在他们的热情中走了很远。
关于c++ - 函数式转换被认为是有害的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23025599/