对于固定大小的数组,正确的c ++样式转换?

时间:2013-06-19 13:37:20

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

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

基本上,我有以下代码:

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

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

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

但在Effective C ++中,我读了

  

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

并且这些应该非常罕见。

然后,我应该选哪个演员?我明显地消除了const_castdynamic_cast,但无法确定我应该使用哪一个......(而这个问题并没有真正帮助我,因为我不知道我是否是这样的事实想要将一个固定大小的数组转换为来自OpenAL影响的指针类型。)

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

2 个答案:

答案 0 :(得分:3)

在这种情况下,您可能需要进行任何演员。

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

答案 1 :(得分:0)

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

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

更好的是设计你的代码,这样你就不需要进行转换:exploting polymorphism可以帮助你避免它们。