首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从const和参数到&参数的无效转换似乎是无稽之谈?

从const和参数到&参数的无效转换似乎是无稽之谈?
EN

Stack Overflow用户
提问于 2016-11-17 10:37:41
回答 2查看 369关注 0票数 1

我只是好奇。我将指针传递给带有签名的函数。

代码语言:javascript
复制
void printCommandReceived(const CommandDescriptor &descriptor)

作为具有签名的构造函数的第三个参数。

代码语言:javascript
复制
CommandLogFilter::CommandLogFilter(QSharedPointer<LogServer> logServer, QObject *parent,
                      void (*preprocessValidCommand)(CommandDescriptor &descriptor))

并从g++编译器获得错误:

代码语言:javascript
复制
error: invalid conversion from ‘void (*)(const CommandDescriptor&)’ to ‘void (*)(CommandDescriptor&)’ [-fpermissive]

根据我的理解,对非const对象的引用应该可以用作引用const对象参数的参数。因此,对于接受非const对象引用的函数,带有类型指针的参数应该满足类型指针到函数的参数(并进行隐式转换),后者甚至接受const对象引用。

我哪里错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-17 10:57:09

void (*)(const CommandDescriptor&)void (*)(CommandDescriptor&)是两种完全不同、互不相关的类型。

关于const,有非常简单的规则:X*可以转换为X const*X**可以转换为X const * const *等等。推荐信也是一样的。其他的都不允许。

请注意,规则不允许在类型中的任何位置任意添加或删除const,例如,不能将X**转换为X const **。函数参数的位置也是如此:您只是不能在那里添加或删除const以获得兼容的类型。

这些规则能否得到扩展,以适应像你这样的情况,并保持一致?可能是的。但事实并非如此。

票数 2
EN

Stack Overflow用户

发布于 2016-11-17 13:57:09

C++有一组有限的情况,可以隐式地添加或删除const。你遇到了一个无法做到的地方。原因可能很简单,比如“描述那些安全的案例将很难,而标准作者则是懒惰和保守的”。

作为一项工作,你可以这样做:

代码语言:javascript
复制
CommandLogFilter bob(
  logServer,
  parent,
  [](CommandDescriptor &descriptor) {
    return printCommandReceived(descriptor);
  }
);

因为无状态lambdas可以隐式地将其转换为指向与其签名匹配的函数的指针。

我不喜欢在那里明确签名,但是没有办法对模板"auto“做类似的事情,并且很不幸地推导出了签名。

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

https://stackoverflow.com/questions/40652599

复制
相关文章

相似问题

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