2014-10-11 57 views
1

是否可以将一个常量引用作为指针进行投射,如果是这样的话?是否可以将一个常量引用作为指针?

这是我认为演员应该像:

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

该示例不编译,我不能为我的生命明白为什么。

+0

你想达到什么目的?为什么不'&someVal'? – 2014-10-11 18:36:25

+3

你为什么这样做? – 2014-10-11 18:36:35

+0

我不能为我的生活理解为什么你期望它*不*不*编译。有人告诉你“引用实际上是指针”吗?如果他们这样做,不要相信他们。 – molbdnilo 2014-10-11 18:38:05

回答

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,或者可能需要更激进的如果您想使用的代码需要修改对象,则重新设计。另外,如果你把一个对象的地址,然后通常的注意事项适用;最重要的是,取一个本地对象的地址,保留它并在以后取消引用,当对象已被销毁时,会导致未定义的行为。

+0

感谢您的详细解释,这解决了我的问题,并澄清了我对指针/参考的知识! – Foo 2014-10-11 18:52:50

+0

_“(不要让语法让你感到困惑,并且在这两行代码中扮演完全不同的角色。)”_ +1提到这一点。 – 2014-10-11 18:57:04

0

有几个问题。第一,你不能有未初始化的引用:

const TypeFoo &someVal; // error 

你需要把它引用了一句:

TypeFoo x; 
const TypeFoo &someVal = x; 

下一个问题是,引用和指针都没有互换。很可能你要做的就是取地址:

const TypeFoo *pSomePtr = &someVal; 

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

+0

我应该在我的问题中更加清楚,所有变量都已经初始化了。你是对的,我确实需要引用对象的地址。我从不知道参考文献和指针不可互换。 – Foo 2014-10-11 18:48:19

1

如果你真的确定你需要做到这一点,而使用const_cast

const TypeFoo &someVal = x; // lets assume it's initialized correctly 
TypeFoo *pSomePtr = const_cast<TypeFoo*>(&someVal); 
+0

这解决了我的编译问题,谢谢! – Foo 2014-10-11 18:49:58

相关问题