是否可以将常量引用转换为指针?

时间:2014-10-11 18:35:09

标签: c++

是否可以将常量引用转换为指针,如果是,如何?

这就是我认为演员表应该是这样的:

const TypeFoo &someVal;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal);

这个例子没有编译,我不能为我的生活理解为什么。

3 个答案:

答案 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;

引用的地址是指向它引用的对象的指针。