在“编程:使用C ++的原理和实践”的“ 8.5.7节参数检查和转换”中,给出了以下示例作为有关如何正确转换类型的证据,但从未明确说明为什么要使用{{1 }}与int()
进行比较,将static_cast<int>()
转换为double
。但是,我仍然不清楚int
与static_cast<int>()
的好处。
int()
我检查了第17.8节,但仍未清楚此主题。有人可以帮忙吗?我正在寻找一种将static_cast与函数样式转换进行比较的解决方案。
答案 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.
}