是否有"安全"的static_cast替代方案?

And*_*nak 16 c++ safety-critical type-safety narrowing c++11

static_cast在C++ 11/14或实现此功能的库中是否有"安全"替代方案?

"安全"我的意思是演员应该只允许不失精度的演员.因此,如果数字适合a ,则仅允许来自int64_tto int32_t的强制转换int32_t,否则报告错误.

Cal*_*eth 34

gsl::narrow

窄// narrow<T>(x)static_cast<T>(x)if static_cast<T>(x) == x还是它抛出narrowing_error

  • 好答案.也许值得扩展你的答案来建立**指南支持图书馆的**善意?有些读者可能不熟悉[标准C++基础](https://isocpp.org/about),[C++核心指南](http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c-core-指南)或指南支持库等可能会将`gsl`视为"只是另一个库"? (13认同)
  • @FrankBoyne同意,我首先想知道,GNU科学库如何具有C ++实用程序... (2认同)

Xir*_*ema 21

你的用例被颠倒了.

static_cast(以及其他c ++风格的演员表)的预期用途是表明程序员的意图.当你写作时auto value = static_cast<int32_t>(value_64);,你会说"是的,我非常*打算*向下转换这个值,当我执行这个任务时可能会截断它".结果,编译器可能倾向于在正常情况下(例如,如果你已经写过int32_t value = value_64;)抱怨这种转换,而是观察"好吧,程序员告诉我这是他们想要的;为什么他们会撒谎对我来说?" 并将静默编译代码.

如果你希望你的C++代码,以警告或扔在不安全的转换错误,你需要明确地使用static_cast,const_cast,reinterpret_cast,,让编译器完成其工作.编译器有改变警告怎么治疗(向下转型的标志int64_t,以int32_t通常只产生一个警告),所以一定要确保你使用了正确的标志,以迫使被视为错误的警告.

  • @Caleth我对他们的建议是*如果他们想要这样的指示,就不要*使用这些演员表.编译器通常会在没有明确转换的情况下发生缩小转换时发出警告. (6认同)
  • @MooingDuck如果你知道值总是0-100然后使用static_cast,那就是它的用途...... (6认同)
  • @Xirema:(A)编译器通常不会发出警告,并且(B)编译器在将`long`转换为`char`时经常会过时,但开发人员知道值始终在0到100之间. (3认同)
  • @immibis:让我自己纠正; 开发人员知道值_应该在0到100之间,但是如果确定该假设不正确则需要抛出异常. (3认同)
  • @MooingDuck我不确定你期望编译器做什么呢?它可以在范围之外(在这种情况下你应该得到警告)或它不能(在这种情况下使用static_cast). (3认同)
  • @immibis我认为理想的行为是生成一些代码,如if(i <256)static_cast <char>(i); 否则抛出bad_cast_exception;` (2认同)