【问题标题】:Correct c++-style cast for fixed size arrays?为固定大小的数组正确的 c++ 样式转换?
【发布时间】:2013-06-16 01:47:04
【问题描述】:

我有一个关于演员表的小问题。

基本上,我有以下代码:

//Array of ALbyte, size is irrelevant
ALbyte buffer[1000];
//...
alcCaptureSamples(m_audioDevice,(ALCvoid*)buffer, sample);

根据 Scott Meyers Effective C++ 建议,我想为此使用 c++ 风格的演员表。

但我真的不知道应该在reinterpret_cast<ALCvoid*>static_cast<ALCvoid*> 之间选择哪一个。他们在MSDN 上说reinterpret_cast 用于将指针转换为另一种指针类型。

但在 Effective C++ 中,我阅读了

reinterpret_cast 用于产生依赖于实现(即不可移植)结果的低级强制转换,例如,将指针强制转换为 int

而且这些应该是非常罕见的。

那么,我应该选择哪个演员?我显然消除了const_castdynamic_cast,但无法确定我应该使用剩下的哪一个......(这个问题并没有真正帮助我,因为我不知道我是否想投固定大小的数组转换成指针类型不受 OpenAL 影响)。

或者在这种情况下我应该完全避免 C++ 风格的转换(但为什么)?

【问题讨论】:

标签: c++ reinterpret-cast static-cast


【解决方案1】:

在这种情况下,您可能不需要进行任何转换。

请记住,数组自然会衰减为指针,并且所有指针都可以隐式转换为 void*(我猜 ALCvoid* 是这样)。

【讨论】:

  • 这可能有点挑剔,但说“隐式转换”不是更清楚(如果您不需要做任何casting)。 +1 不过
  • 确实......我不知道为什么,但我认为不明确演员(或者更确切地说是“转换”)感觉不对(就像ACLvoid*而不是纯粹void*)...
【解决方案2】:

您应该尽可能使用static_cast,因为它会执行编译时检查:编译器不会让您转换为无效的指针类型。

reinterpret_cast 不能执行除constnon-const 之外的任何编译时检查。它很少使用,除非使用需要void* 的旧接口进行编程。

更好的办法是设计你的代码,这样你就不需要进行强制转换:探索多态性可以帮助你避免它们。

【讨论】:

  • 好吧,在这种情况下,我认为我无法真正避免这种情况并重新设计(尽管我愿意),因为 OpenAL 在其函数中请求的类型...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2020-12-01
  • 2016-10-29
  • 2021-01-07
  • 2015-07-28
相关资源
最近更新 更多