是否可以将常量引用转换为指针,如果是,如何?
这就是我认为演员表应该是这样的:
const TypeFoo &someVal;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal);
这个例子没有编译,我不能为我的生活理解为什么。
答案 0 :(得分:2)
您的代码:
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
对象,那么你面临一个全新的问题,如果你很幸运,可以用const_cast
来解决这个问题。处理错误的API,或者如果您要使用的代码需要修改对象,则可能需要进行更彻底的重新设计。
此外,如果您获取对象的地址,则通常的警告适用;最重要的是,当对象已经被销毁时,获取本地对象的地址,保留它并在以后取消引用它会导致未定义的行为。
答案 1 :(得分:1)
如果您确定需要这样做,请使用const_cast
:
const TypeFoo &someVal = x; // lets assume it's initialized correctly
TypeFoo *pSomePtr = const_cast<TypeFoo*>(&someVal);
答案 2 :(得分:0)
有几个问题。首先,您无法获得未初始化的参考:
const TypeFoo &someVal; // error
你需要引用它:
TypeFoo x;
const TypeFoo &someVal = x;
下一个问题是引用和指针不可互换。你最有可能的意思是拿地址:
const TypeFoo *pSomePtr = &someVal;
引用的地址是指向它引用的对象的指针。