9

我在 C++ 程序中有一个枚举参数,我需要使用一个通过参数返回值的函数来获取该参数。我首先将其声明为 int,但在代码审查中被要求将其键入为枚举 (ControlSource)。我这样做了,但它破坏了 Get() 函数——我注意到 C 风格的转换为 int& 解决了这个问题,但是当我第一次尝试用 static_cast<> 修复它时,它没有编译。

为什么会这样,为什么当 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?
4

2 回答 2

8

当您将变量转换为不同类型的值时,您将获得一个临时值,该值不能绑定到非常量引用:修改临时值没有任何意义。

如果您只需要读取该值,则常量引用应该没问题:

static_cast<int const &>(eTimeSource)

但是您也可以只创建一个实际值,而不是引用:

static_cast<int>(eTimeSource)
于 2013-03-08T17:16:53.060 回答
3
static_cast<int&>((eTimeSource))); //This doesn't work.

对,它不起作用,因为eTimeSourceis not anint所以你不能将 a 绑定int&到它。

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

错了,这也不起作用,它只是看起来。C 风格的转换对编译器说谎并说“只要让它成为这种类型,即使那是不合法的”。仅仅因为某些东西可以编译并不意味着它可以工作。

为什么什么时候eTimeSource根本int不需要强制转换来通过引用传递整数?

因为您可以将 an 绑定int&到 anint但不能绑定到不同的类型,并且eTimeSource是不同的类型。Anint&是对 的引用int。如果你可以将它绑定到不同的类型,它就不会引用 an int,不是吗?

如果代码审阅者说要将变量更改为枚举类型,他们可能还意味着您要更改函数参数以获取ControlSource&

于 2013-03-08T17:20:54.857 回答