首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将常量引用转换为指针?

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

Stack Overflow用户
提问于 2014-10-11 18:35:09
回答 3查看 1.2K关注 0票数 2

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

这就是我认为演员应该是什么样子的:

代码语言:javascript
复制
const TypeFoo &someVal;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal);

这个例子没有编译,我无法为我的一生理解为什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-11 18:48:08

你的代码:

代码语言:javascript
复制
const TypeFoo &someVal;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal);

这是因为您忽略了C++中引用的关键点,这可以概括为:

引用是对象.

引用不应视为一种特殊的指针。它没有指向任何东西。这是代码中的另一个名称。因此,您正在尝试将TypeFoo转换为指针,这是不允许的,即使在reinterpret_cast中也不允许。对于以下代码,编译器应该发出完全相同的错误:

代码语言:javascript
复制
const TypeFoo someVal = /* ... */;
TypeFoo *pSomePtr = reinterpret_cast<TypeFoo*>(someVal); // error

如果您需要一个TypeFoo *,那么可以获取对象的地址:

代码语言:javascript
复制
const TypeFoo &someVal = /* ... */;
const TypeFoo *pSomePtr = &someVal;

(不要让语法混淆了您。&在这两行代码中扮演完全不同的角色。)

注意,指针必须是指向const的指针,因为对象也是const。如果您需要一个非const指针,但是有一个const对象,那么您将面临一种全新的问题,如果您运气好,并且只处理一个糟糕的API,就可以用const_cast解决这个问题,或者如果您想要使用的代码需要修改该对象,则可能需要进行更彻底的重新设计。

此外,如果您获取对象的地址,则应用通常的警告;最重要的是,获取本地对象的地址,将其保持在周围,并在对象已被销毁后,在稍后取消引用,会导致未定义的行为。

票数 2
EN

Stack Overflow用户

发布于 2014-10-11 18:40:14

如果您确实需要这样做,请使用const_cast

代码语言:javascript
复制
 const TypeFoo &someVal = x; // lets assume it's initialized correctly
 TypeFoo *pSomePtr = const_cast<TypeFoo*>(&someVal);
票数 1
EN

Stack Overflow用户

发布于 2014-10-11 18:39:36

有几个问题。首先,您不能拥有未初始化的引用:

代码语言:javascript
复制
const TypeFoo &someVal;  // error

你需要让它引用一些东西:

代码语言:javascript
复制
TypeFoo x;
const TypeFoo &someVal = x;

下一个问题是引用和指针是不可交换的。很可能你要做的就是记下地址:

代码语言:javascript
复制
const TypeFoo *pSomePtr = &someVal;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26317901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档