是否可以将常量引用转换为指针,如果可以,则如何转换?
这就是我认为演员应该是什么样子的:
const TypeFoo &someVal;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal);这个例子没有编译,我无法为我的一生理解为什么。
发布于 2014-10-11 18:48:08
你的代码:
const TypeFoo &someVal;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal);这是因为您忽略了C++中引用的关键点,这可以概括为:
引用是对象.
引用不应视为一种特殊的指针。它没有指向任何东西。这是代码中的另一个名称。因此,您正在尝试将TypeFoo转换为指针,这是不允许的,即使在reinterpret_cast中也不允许。对于以下代码,编译器应该发出完全相同的错误:
const TypeFoo someVal = /* ... */;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal); // error如果您需要一个TypeFoo *,那么可以获取对象的地址:
const TypeFoo &someVal = /* ... */;
const TypeFoo *pSomePtr = &someVal;(不要让语法混淆了您。&在这两行代码中扮演完全不同的角色。)
注意,指针必须是指向const的指针,因为对象也是const。如果您需要一个非const指针,但是有一个const对象,那么您将面临一种全新的问题,如果您运气好,并且只处理一个糟糕的API,就可以用const_cast解决这个问题,或者如果您想要使用的代码需要修改该对象,则可能需要进行更彻底的重新设计。
此外,如果您获取对象的地址,则应用通常的警告;最重要的是,获取本地对象的地址,将其保持在周围,并在对象已被销毁后,在稍后取消引用,会导致未定义的行为。
发布于 2014-10-11 18:40:14
如果您确实需要这样做,请使用const_cast
const TypeFoo &someVal = x; // lets assume it's initialized correctly
TypeFoo *pSomePtr = const_cast<TypeFoo*>(&someVal);发布于 2014-10-11 18:39:36
有几个问题。首先,您不能拥有未初始化的引用:
const TypeFoo &someVal; // error你需要让它引用一些东西:
TypeFoo x;
const TypeFoo &someVal = x;下一个问题是引用和指针是不可交换的。很可能你要做的就是记下地址:
const TypeFoo *pSomePtr = &someVal;引用的地址是指向它引用的对象的指针。
https://stackoverflow.com/questions/26317901
复制相似问题