[英]Why can't I use static_cast<int&> to pass an integer reference parameter to a function in C++?
我在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?
当您将变量转换为不同类型的值时,您将获得一个临时值,该值不能绑定到非常量引用:修改临时值是没有意义的。
如果您只需要读取值,则常量引用应该没问题:
static_cast<int const &>(eTimeSource)
但您也可以创建一个实际值,而不是引用:
static_cast<int>(eTimeSource)
static_cast<int&>((eTimeSource))); //This doesn't work.
是的,它不起作用,因为eTimeSource
不是一个int
所以你不能绑定一个int&
它。
(int&)((eTimeSource))); //This does work.
错了,这也不起作用,它似乎只是。 C风格的演员阵容归于编译器,并说“只要把它变成这种类型,即使这不合法”。 仅仅因为编译的东西并不意味着它有效。
为什么当
eTimeSource
是一个int
根本不需要转换来通过引用传递整数?
因为您可以将int&
int
绑定到不同的类型,而eTimeSource
是不同的类型。 一个int&
是一个参考int
。 如果你可以将它绑定到不同的类型,它就不会引用int
,不是吗?
如果代码审阅者说要将变量更改为枚举类型,那么他们可能还意味着您需要更改函数参数以获取ControlSource&
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.