你怎么知道你是否可以将一个类型static_cast成一个不同的类型?

时间:2016-10-26 04:57:25

标签: c++

这是来自static_cast的维基百科描述的引用。

“type参数必须是可以通过已知方法转换对象的数据类型,无论是内置还是强制转换。类型可以是引用或枚举。所有类型的转换都很好 - 编译器定义和允许使用static_cast执行。“

你如何找出这种“已知方法”?

2 个答案:

答案 0 :(得分:3)

以下是static_cast可以执行的转化列表:

  • 派生类指针(resp.reference)的基类指针(resp。引用)
  • 任何隐式转换
  • 调用显式构造函数或显式转换函数的转换
  • Lvalue to xvalue
  • void
  • 的任何类型
  • 在算术类型和枚举类型之间,或两种不同的枚举类型
  • 从指向派生类成员的指针到指向基类成员的指针,前提是指向类型匹配
  • void*T*,其中T是对象类型

在第二和第三个项目符号点的情况下,可能存在多个可能的转换序列。过载分辨率用于选择最佳分辨率。确实,有时可能并不明显哪一个是最好的,编译器将选择的那个(这就是为什么不过度使用重载构造函数和转换函数的好主意)。如果重载决策不明确,程序将无法编译。

答案 1 :(得分:0)

实际上,应该使用static_cast而不是隐式类型转换。

e.g。你宣布一个函数 -

void fun(int a)
{
   std::cout << a;
}

所以,fun接受一个int。但是,如果你称之为 -

float b = 1.2;
fun(b);

现在,有趣(b)是有效的&amp;它会编译和将打印1.这里,实际上是float的b已被隐式转换为int。在大型程序中,这可能会导致一些难以找到的错误。因此,为了使这种转换明确,我们使用static_cast作为 -

fun(static_cast<int>(b));

现在,何时使用static_cast完全取决于程序员的理解。因为,编译器不对static_cast执行任何运行时检查。因此,程序员需要验证static_cast转换的结果是否安全。