1一个小区别 - 对于某些在表示法中使用空格或特殊字符的类型,函数转换无法编译。这只是一个语法限制,如果你取出 typedef / using 中的类型,那么一切都会开始工作:
// int *ptr = int*(x); // Ошибка.
// unsigned int y = unsigned int(x); // Ошибка. Хотя MSVC это компилирует, это нарушает стандарт.
using A = int *;
int *ptr = A(x); // ок
using B = unsigned int;
unsigned int y = B(x); // ок
unsigned int z = unsigned(x); // ок
第一个术语:
MyType(x)是一个函数式演员表。它与 C 风格的强制转换1没有什么不同,所以下面我将它们都称为 C 风格强制转换。MyType(x, y, ...)是构造函数调用。这不是C风格的演员阵容。MyType{x}并且MyType{x, y, ...}不是 C 风格的演员。有两个(半)个营地。(关于合理阵营,一般来说,到处写C式种姓是不合理的,所以不予考虑。)
第一阵营: C 型铸件较短,因此在安全的情况下,使用它们会更安全/更好。
对 C 风格强制转换的主要抱怨是它们对指针和引用的使用。
(MyClass &)ptr- 就是这样?选项:转换为父级(可以在多重继承上移动指针)。
reinterpret_cast。卑鄙
const_cast(可能与 结合reinterpret_cast)。operator MyClass &在课堂上。(类似于插入链接,不计算最后一段)
首先,很难通过肉眼确定哪些选项在这里有效。其次,当代码更改时,变体可能会突然更改(父级被删除,并且对父级的完全合法转换开始像 一样工作
reinterpret_cast)。另一个可能的问题是,他们想做
reinterpret_cast,但他们在类型上犯了一个错误const_cast。或相反亦然。并且转换为非指针非引用是非常无害的:
您在这里编写的内容
static_cast<float>(max_health)不会使您的代码更安全。因此,阵营1认为非指针和非引用可以用C风格的强制转换来强制转换,而其余的应该用C++强制转换。
这里可以进行澄清,例如,
(T *)nullptr它不是从加号演员中获胜的。您可以考虑简洁,也可以禁用以简化规则。阵营 2:到处都是 C++ 风格的强制转换以实现一致性。
并非有时所说的“为了安全”,因为它并不比选项 1 更安全。
这正是规则的简化,这样人们就不必记住 C 风格的强制转换何时安全、何时不安全。但这是以延长记录为代价的。
无论是哪两个阵营,都有
MyClass{x},比C型演员阵容还要有限static_cast。(例如,int它float不会进行投射,因为它会失去精度。)在这两个阵营中,有些人喜欢默认使用它而不是 C 风格的强制转换,
static_cast如果它有效的话。您可以立即采取 C 式演员阵容或static_cast.主题:
MyClass x(...);对比MyClass x{...};1一个小区别 - 对于某些在表示法中使用空格或特殊字符的类型,函数转换无法编译。这只是一个语法限制,如果你取出 typedef / using 中的类型,那么一切都会开始工作: