c++ - 函数式转换被认为是有害的?

标签 c++ casting

我知道通常 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/

相关文章:

c++ - 从 QImage 获取原始数据

c++ - 如何最小化加载 vector 的时间?

c# - 我应该将属性声明为接口(interface)还是基类(当它们同时实现时)?

mysql - 自动 MySQL 数据类型转换

c# - 在 C# 中将泛型显式转换为另一种类型

c++ - 创建类型拷贝

c++ - 什么时候应该使用 C++ 而不是 SQL?

c# - 为什么 Select(x => ...Cast<x.GetType()>()) 不起作用?

mysql - 在子字符串索引中使用强制转换

c++ - 虚继承/多态