Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪种是记录静态类型转换的惯用方法?_C++_Casting_Static Cast - Fatal编程技术网

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统一初始化和被诱发)我允许他们使用算术类型。我不认为std::tolower(static_cast(c))比std::tolower((unsigned char)c)更好。目标类型足以确保它不能删除const或其他任何东西。但是,如果你需要一个非常简单的规则,那么就必须禁止它们。IIRC还有一些愚蠢的事情,只能用C风格的演员来完成,但在几乎所有的情况下,你都不需要做任何事情。“将指针转换为指向私有基或其他对象的指针”。@SteveJessop:我并没有真正考虑算术类型。我想我或多或少同意你的看法。从某种意义上讲,
i
的类型将来可能会改变,但这似乎有点不可思议。@SteveJessop:对。对不起,删除了你下面的评论。我突然感到恐慌,如果它变为指针类型会发生什么(你可能希望代码无法编译,因为即使
tolower
调用是“安全的”,但没有意义),但我不知道