static_cast<int>(foo)与(int)foo的区别

35
请有人详细说明一下它们的区别吗?

3
为何在C++中使用static_cast<int>(x)而不是(int)x的精确副本? - jalf
1
这个回答解决了你的问题吗?为什么要使用static_cast<int>(x)而不是(int)x? - Mariia Illarionova
3个回答

60

区别在于(int)foo可能意味着半打不同的含义。 它可能是一个static_cast(在静态已知类型之间进行转换),也可能是一个const_cast(添加或删除const性质),或者可能是一个reinterpret_cast(在指针类型之间进行转换)。

编译器会尝试每个选项,直到找到可行的选项。这意味着它可能并不总是选择您期望的选项,因此它可能成为微妙的错误源。

此外,使用static_cast更容易搜索或执行搜索/替换。


C风格的转换无法像dynamic_cast一样进行“安全”的向下转换,只能进行像static_cast一样的“不安全”向下转换。 - bk1e
1
此外,我在“安全”和“不安全”两个词中加了引号,因为在C++中没有真正安全的东西。 - bk1e
"(int)foo... 可能是 dynamic_cast(向派生类的下转换)" 这是不正确的。 (int)foo 永远不会变成动态转换。 - Suma
非常好的答案,我终于明白了! - Vinicius Horta
(int)foo和int(foo)是一样的吗? - apokaliptis

11
看看 Stroustrup 对此的看法,包括以下内容:
“因为 C 风格的转换 (T) 可以用于表达许多逻辑上不同的操作,编译器只有最基本的机会来捕获误用。[...]”
“‘新风格转换’ 的引入是为了给程序员一个更清晰地表达他们的意图的机会,也为了让编译器捕获更多的错误。[...]”
特别地,C++ 在 static_cast 和 reinterpret_cast 之间做出了区分:
“这个想法是,由 static_cast 允许的转换比需要 reinterpret_cast 的转换更不容易导致错误。原则上,可以使用 static_cast 的结果而不将其转换回其原始类型,而应始终在使用 reinterpret_cast 的结果之前将其转换回其原始类型以确保可移植性。”

1

(int) foo 最相似于 c++ 的 reinterpret_cast<int>,即没有对转换的有效性进行检查。


http://www.velocityreviews.com/forums/t280611-reinterpretcastltgt-v-staticcastltgt.html 解释了 static_cast 和 reinterpret_cast 之间的区别。 - Fredrik Jansson
不,它相当于所有C++转换的组合。它将执行第一个有效的类型转换。 - jalf
真的,除了dynamic_cast之外都包括。 - Fredrik Jansson
你是不是想说 (int)foo 的问题在于它大部分情况下会转换成 reinterpret_cast<foo>?所以你实际上并没有受益于静态类型检查。 - Brian Matthews
这个答案是错误的。reinterpret_cast,像其他C++转换一样,与C风格转换相比只能做很少的事情。 - Johannes Schaub - litb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接