static_cast <type>()与type()

时间:2018-11-25 21:21:04

标签: c++ type-conversion explicit-conversion

在“编程:使用C ++的原理和实践”的“ 8.5.7节参数检查和转换”中,给出了以下示例作为有关如何正确转换类型的证据,但从未明确说明为什么要使用{{1 }}与int()进行比较,将static_cast<int>()转换为double。但是,我仍然不清楚intstatic_cast<int>()的好处。

int()

我检查了第17.8节,但仍未清楚此主题。有人可以帮忙吗?我正在寻找一种将static_cast与函数样式转换进行比较的解决方案。

1 个答案:

答案 0 :(得分:1)

显式类型转换是允许的[expr.type.conv]

  

如果初始化程序是带括号的单个表达式,则类型转换表达式等同于相应的 cast表达式

另一方面,如果仅将其用于基本类型,则应该没问题。永远不要在通用代码中使用它:

template<class T,class...Args>
auto dangerous_construct(Args...args){
  return U(args...); //here we could have a reinterpret_cast
  }
int i;
double* v = dangerous_build<double*>(&i);//no compilation error!

如果您想要短而安全的演员,请使用大括号样式:

template<T,class...Args>
auto safe_construct(Args...args){
  return U{args...}; //OK equivalent to a static_cast + narrowing checks.
  }