以 arg 为 'const arg *&' 的函数的参数转换

Posted

技术标签:

【中文标题】以 arg 为 \'const arg *&\' 的函数的参数转换【英文标题】:Argument conversion for function taking an arg as 'const arg *&'以 arg 为 'const arg *&' 的函数的参数转换 【发布时间】:2012-02-10 00:25:22 【问题描述】:

这是我在恢复旧代码时遇到的问题

还有一个--

所以这里是一个函数的定义:-

int shen_get_entity_from_list(const ENTITY_LIST& list, const ENTITY*& e);

这是定义变量的方式

ENTITY *t_ent = NULL, *p_e = NULL, *s_e = NULL, *t_e = NULL;

现在当我调用这个函数时

s_pos = shen_get_entity_from_list(sortedACISfeatureList, s_e);

它给了我以下错误

错误 C2664:'shen_get_entity_from_list':无法将参数 2 从 'ENTITY *' 转换为 'const ENTITY *&'

【问题讨论】:

只是出于兴趣:是否有理由将 const 引用传递给指针?没看懂 @Niklas :这不是对指针的 const 引用,而是对指向 const 对象的指针的引用。在函数可能修改指针但不修改指向对象的情况下,这是简单的 const 正确性(即,一件好事)。 @ildjarn:感谢您的精彩解释 :) 这些类型声明总是让我着迷。 【参考方案1】:

s_e变量需要声明为:

const ENTITY* s_e = NULL;

匹配函数的声明。这表示在调用函数后您不会使用 s_e 指针来修改它指向的实体。

【讨论】:

【参考方案2】:

引用不是已经是 const 类型了吗?并在创建时本身就需要价值?

不允许空指针引用。

由于所有这些,我觉得这个问题无法解决

【讨论】:

【参考方案3】:

尝试移动常量:

int shen_get_entity_from_list(const ENTITY_LIST& list, ENTITY* const& e);

这为您提供了对所传递类型的 const 引用,而不是对指向 const ENTITY 的指针的非常量引用。

【讨论】:

嗯,但为什么一开始就不能转换参数呢? @NiklasB。因为如果 shen_get_entity_from_liste 更改为指向 const ENTITY 对象,那么在它返回 ENTITY* 后,您传入的 (s_e) 将是指向 const 对象的非常量指针,违反了 const 规则。 @je4d:谢谢你的解释!

以上是关于以 arg 为 'const arg *&' 的函数的参数转换的主要内容,如果未能解决你的问题,请参考以下文章

找出可变参数宏中__VA_ARGS__的类型

参数传递方式的选择

访问器函数采用 const arg 但在 C 中返回非 const 指针

execv() 和 const-ness

"CONST func(arg);" 是啥意思在C语言中是啥意思?

使用 `struct S const char *array[ARG_MAX]; 避免来自 `struct S as[] = NULL;` 的段错误;`? [复制]