是否可以将一个常量引用作为指针进行投射,如果是这样的话?是否可以将一个常量引用作为指针?
这是我认为演员应该像:
const TypeFoo &someVal;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal);
该示例不编译,我不能为我的生命明白为什么。
是否可以将一个常量引用作为指针进行投射,如果是这样的话?是否可以将一个常量引用作为指针?
这是我认为演员应该像:
const TypeFoo &someVal;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal);
该示例不编译,我不能为我的生命明白为什么。
您的代码:
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,或者可能需要更激进的如果您想使用的代码需要修改对象,则重新设计。另外,如果你把一个对象的地址,然后通常的注意事项适用;最重要的是,取一个本地对象的地址,保留它并在以后取消引用,当对象已被销毁时,会导致未定义的行为。
感谢您的详细解释,这解决了我的问题,并澄清了我对指针/参考的知识! – Foo 2014-10-11 18:52:50
_“(不要让语法让你感到困惑,并且在这两行代码中扮演完全不同的角色。)”_ +1提到这一点。 – 2014-10-11 18:57:04
有几个问题。第一,你不能有未初始化的引用:
const TypeFoo &someVal; // error
你需要把它引用了一句:
TypeFoo x;
const TypeFoo &someVal = x;
下一个问题是,引用和指针都没有互换。很可能你要做的就是取地址:
const TypeFoo *pSomePtr = &someVal;
引用的地址是指向它引用的对象的指针。
我应该在我的问题中更加清楚,所有变量都已经初始化了。你是对的,我确实需要引用对象的地址。我从不知道参考文献和指针不可互换。 – Foo 2014-10-11 18:48:19
如果你真的确定你需要做到这一点,而使用const_cast
:
const TypeFoo &someVal = x; // lets assume it's initialized correctly
TypeFoo *pSomePtr = const_cast<TypeFoo*>(&someVal);
这解决了我的编译问题,谢谢! – Foo 2014-10-11 18:49:58
你想达到什么目的?为什么不'&someVal'? – 2014-10-11 18:36:25
你为什么这样做? – 2014-10-11 18:36:35
我不能为我的生活理解为什么你期望它*不*不*编译。有人告诉你“引用实际上是指针”吗?如果他们这样做,不要相信他们。 – molbdnilo 2014-10-11 18:38:05