C++ 哪种是记录静态类型转换的惯用方法?
我知道C++ 哪种是记录静态类型转换的惯用方法?,c++,casting,static-cast,C++,Casting,Static Cast,我知道(MyType)foo,MyType(foo),和static\u cast(foo)有点相似,前两个变成了最后一个(编辑:我已被更正。前一句话不正确)。我的问题是使用哪一个惯用版本?背景是一个考虑因素吗 因为我知道C风格的转换在C++中不是首选的,它是函数的转换和静态的转换。 static\u cast(foo)优于(MyType)foo,因为它更具表现力和明确性。这在许多情况下尤其有用,因为(MyType)foo并不是您所期望的意思。例如,在您的示例中,这些情况可能根本不会减少到静态\
(MyType)foo
,MyType(foo)
,和static\u cast(foo)
有点相似,前两个变成了最后一个(编辑:我已被更正。前一句话不正确)。我的问题是使用哪一个惯用版本?背景是一个考虑因素吗
因为我知道C风格的转换在C++中不是首选的,它是函数的转换和静态的转换。
static\u cast(foo)
优于(MyType)foo
,因为它更具表现力和明确性。这在许多情况下尤其有用,因为(MyType)foo
并不是您所期望的意思。例如,在您的示例中,这些情况可能根本不会减少到静态\u cast
,而是重新解释\u cast
在代码审查中,我会拒绝所有非算术类型的C样式转换。
,而对于C++来说,函数式转换是C样式的转换。他们做同样的事情
C型强制转换首先尝试静态强制转换
,如果不起作用,则执行重新解释强制转换
1。这是不好的,因为旨在进行简单更改的操作可能会变得非常奇怪
例如,假设您有一个Foo*f
和一个完全不相关的类Bar
。您可以(Bar*)f
,它会自动将*f
重新解释为条
,可能会导致未定义的行为
只有当Foo
和Bar
是相关类型时,static\u cast
才会在这种情况下工作
现在,即使是static\u cast
也可能太强,所以我经常编写一个implicit\u cast
或non\u cast
模板,在不强制转换的情况下进行转换。类似地,我将写为_const
,添加const
,而不需要const
(它既可以添加也可以删除const
,删除const
比添加它危险得多)
< P> >在C++中没有明确的安全强制转换,我不知道如何编写一个(将执行代码< >显式< /COD>构造函数,但不会像“代码> STATICEXCAST WRY”那样的类型层次结构。
1这是一个过度简化的问题,但与事实非常接近。前两个,即
(MyType)foo
和MyType(foo)
,具有相同的含义。含义在很大程度上取决于MyType
和foo
的类型。例如:
((int)1.0); // a static_cast
int i = 0;
((char*)&i); // a reinterpret_cast
const int j = 0;
((int*)&j); // a const_cast
((char*)&j); // a combination of a const_cast and a reinterpret_cast
typedef char *CharPtr;
CharPtr(&j); // a C-style cast, same as ((CharPtr)&j) or ((char*)&j)
因此,C样式转换不被首选的原因是C样式转换可以做很多不同的事情。C++提供了区分它们的方法。在很多情况下,这使得代码更容易理解,尤其是当您在C++中编写通用代码时,类型比C.</P>中的典型代码要明显的少。
这就是为什么在C++中,代码> STATICEXCAST static_cast也可以做一些不同的事情,因此原则上您可能需要更多不同的强制转换。但是static_cast
至少比C风格的cast做得少
带有一个参数的函数式类型转换是C型类型转换。在标准中明确规定,在所有情况下,它们的含义完全相同
现在,在某些情况下,当使用函数语法编写时,您可能会接受C样式转换,但当使用C样式转换语法编写时,您可能不会接受。通常情况下,当目标类型是类并且很明显将调用哪个构造函数时,就会出现这种情况。在这种情况下,
std::vector(0)
比static\u cast(0)
短,而且通常更清晰,因为它可以作为构造函数调用读取。但它仍然有着与编写(std::vector)0
相同的“危险”。如果您以这种方式编写每个转换,那么最终您可能会意外地从指针类型中删除const
。不,它们是不同的。例如,第一个成为一个重新解释\u cast
,而不是静态\u cast
。你可以grep静态\u cast
这一事实使它在我眼中成为赢家。我感到困惑。MyType(foo)不调用构造函数吗?@Bathsheba:是的。剩下的两个也可以。“在C++中没有明确的安全强制转换”——嗯。一个模板函数执行静态\u强制转换
,并且在两个模板参数都是指针类型并且(在删除\u指针
之后)源是目标的基础时被禁用?@SteveJessop“向上”指针强制转换也是安全的,所以是的。SFINAE可能会起作用。BTW,一个“C++显式强制转换”的Web搜索引导我到那里:(简而言之,C++ 11统一初始化和i
的类型将来可能会改变,但这似乎有点不可思议。@SteveJessop:对。对不起,删除了你下面的评论。我突然感到恐慌,如果它变为指针类型会发生什么(你可能希望代码无法编译,因为即使tolower
调用是“安全的”,但没有意义),但我不知道