当前位置: 首页 > 知识库问答 >
问题:

将指针转换为(常量)引用

袁宜民
2023-03-14

当使用来自外部库的函数时,“任意”取消引用指向const引用的指针是否安全?

SomeType const& obj = *LIB_CreateSomething();

这样做是否普遍安全/明智
更重要的是,除了C语言中“不赞成”的原始指针之外,使用常量指针真的有充分的理由这样做吗?

共有2个答案

吕霄
2023-03-14

您真正想要做的是如下所示(参见代码)。Const对象在创建时初始化。有些编译器理解您试图做什么,并且不会抱怨这种形式的赋值。


    SomeType const& obj(*LIB_CreateSomething());

通常在C语言中,你不会这样做。

一个原因是“原始”(裸)指针只有在您是所有者时才会真正受到反对。如果它不属于您,那么从风格上来说使用指针并没有错。

另一个原因是指针可能为空,直接将NULL转换为引用将使引用无法使用。

正如在另一条评论中提到的,实际上你可能是内存的所有者,在这种情况下,你需要管理内存。你不能在引用的情况下这样做。

端木乐语
2023-03-14

这当然不是一个普遍的好主意,或者说根本不是一个好主意。若一个函数返回一个指针,特别是当它调用CreateX之类的东西时,很可能需要管理指针指向的对象的生存期,。你不能通过引用来实现这一点,但你可以通过智能指针来实现。

通常,您不希望创建引用变量。C中的引用主要用作函数参数和返回值。

 类似资料:
  • 假设我保证(通过未指定的方式)我有一个类型的数组,其中包含有效且不相交的可变指针,所有指针都具有生存期。如何将其转换为可变引用数组

  • 问题内容: 的在系统调用 包在Golang返回类型,而底层系统调用实际上返回一个指针。它是如何做到的? 更具体地说,在Golang开发人员的此程序包中,该函数仅返回一个指针。如何将其转换为字节片,就像在Unix软件包中一样? 问题答案: 使用该包,您可以在未导出类型的Mmap方法中执行相同的操作: 这是一个操场的例子。

  • 我创建了2个函数,读取和写入一个路径,声明为: 我创建了一个额外的函数,它将使用路径调用上述函数之一 但是,当作为回调传递给时,编译器会发出以下警告 将“int(const char*,const void,int)”传递给类型为“int()(const char*,void*,int)”的参数的指针类型不兼容 将接受常量指针的函数转换为接受非常量指针的函数会是未定义的行为吗? 我注意到有一个几乎

  • 问题内容: 如果我有: 上面是固定的-我不能更改foo或bar。另外,baz必须在bar内转换回foo struct指针。如何将&foo {}强制转换为interface {},以便在调用bar时可以将其用作参数? 问题答案: 要打开到一个很简单: 为了返回到,您可以执行 类型断言 : 或 类型开关 (类似,但可以是多种类型则很有用):

  • 当HTML代码适合正在生成的一个页面时,我使用iText HTML到pdf,但当HTML代码太大时,它无法工作使用Java代码HTMLConverter.ConvertTopDF(htmlFile,PDFile);使用itext7 HTML2PDF-2.1.6是版本 Java代码 下面是工作的HTML代码 例外情况是

  • 关于指针的转换,C草案标准(N3337)有以下内容: 4.10指针转换 2“指向cv的指针”类型的右值(其中T是对象类型)可以转换为“指向cv的指针无效”类型的右值将“指向cv的指针”转换为“指向cv的指针无效”的结果指向类型为T的对象所在的存储位置的起点,就好像该对象是类型为T的派生度最高的对象(1.8)(即,不是基类子对象)。 和 4.12布尔转换 1算术、枚举、指针或指向成员类型的指针的右值