2013-03-08 445 views
9

我在C++程序,我需要获得使用通过一个参数返回值的函数的枚举参数。我首先声明它是一个int,但在代码审查中被要求将它作为enum(ControlSource)输入。我这样做,但它打破了获取()函数 - 我注意到一个C样式转换为int &解决了问题,但是当我第一次尝试用一个的static_cast <修复>它并没有编译。为什么不能使用的static_cast <int&>为整数基准参数传递给在C++函数?

这是为什么,为什么是它,当eTimeSource是一个int没有施法都需要通过引用传递的整数?

//GetCuePropertyValue signature is (int cueId, int propertyId, int& value); 

ControlSource eTimeSource = ControlSource::NoSource; 

pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, static_cast<int&>(eTimeSource)); //This doesn't work. 

pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, (int&)(eTimeSource)); //This does work. 

int nTimeSource = 0; 
pPlayback->GetCuePropertyValue(blah, blah, nTimeSource); //Works, but no (int&) needed... why? 
+0

“的作品,但没有(INT&)需要......为什么?” - 查看C++文档中有关通过引用传递变量的信息(或请参阅:http://stackoverflow.com/a/410857/1174378) – 2013-03-08 17:18:17

+0

删除了双括号。 我是正确的假设是,C样式转换被调用的reinterpret_cast这个对象上,使其工作?如果是这样,对于基于int类型的枚举是否真的很重要? – Gareth 2013-03-08 18:10:53

+0

不,“reinterpret_cast”与C型“大锤”不一样。如果你需要一个丑陋的黑色转换器来改变代码的类型,那么不要改变它的类型!它适用于'int',它不适用于枚举...似乎很清楚答案对我来说 – 2013-03-08 18:43:54

回答

8

当转换一个变量以不同的类型的值,则获得一个临时的值,它可以不被绑定到一个非恒定的参考:这是没有意义的修改临时。

如果你只需要阅读值,恒定的参考应该是罚款:

static_cast<int const &>(eTimeSource) 

但是你可能也只是创建一个实际的价值,而不是一个参考:

static_cast<int>(eTimeSource) 
+0

在static_cast (eTimeSource)的转换中,编译器告诉我它找不到合适的函数重载,同样适用于static_cast (eTimeSource)。 我真的不想更新GetProperty函数来获取const引用,因为我怀疑它会涉及到其他地方做出很多更改。 – Gareth 2013-03-08 18:06:19

+1

@Gareth:然后创建一个局部变量'int i = static_cast (eTimeSource);'并用'i'调用函数。 – 2013-03-08 19:19:35

+0

够公平 - 这显然会起作用。这有点圆形,但是我首先声明我的变量是int,但根本没有投射,但评论者不喜欢它!我明白了他的观点 - 正确地声明这种类型明确说明了它的用途,但它带来了这个问题...... – Gareth 2013-03-09 00:21:46

3
static_cast<int&>((eTimeSource))); //This doesn't work. 

对,它不起作用,因为eTimeSource不是int所以你不能绑定int&它。

(int&)((eTimeSource))); //This does work. 

错误,这也不起作用,它似乎。 C风格的演员对编译器说谎,并说“只是将它变成这种类型,即使这不合法”。仅仅因为编译的东西并不意味着它可行。

为什么当eTimeSourceint时根本不需要转换整数?

因为你可以绑定一个int&int而不是不同的类型,eTimeSource是不同的类型。一个int&是一个int的参考。如果你可以将它绑定到不同的类型,它不会引用int,是吗?

如果代码评论家说的变量更改为枚举类型,他们可能也意味着你改变函数参数采取ControlSource&

+0

如果'ControlSource'实际上是一个'enum class'呢?鉴于OP代码,这是一个选项AFAICS ... – 2013-03-08 17:33:53

+0

ControlSource是一个C++ Native枚举,而不是枚举类或引用。 此外,审阅者不希望或期望参数更改为枚举类型 - 底层数据存储类依赖于键入的值作为int。已经被接受的是,这应该仍然是这种情况(因为引入枚举类型将花费太长时间 - 这是不重要的,因为进一步下行的GetMethod委托签名不能区分枚举和int之间的区别并获得其过度扭曲)。使'正确'签名工作与我有空ATM时间不兼容! – Gareth 2013-03-08 17:49:26

+0

@DanielFrey,会改变我答案中的任何内容吗? (TBH我只是简单地重新阅读它,所以如果它确实请更正它) – 2013-03-08 17:53:59

相关问题